From 922fc547f5e77e32695970923d35e53c8a6a8521 Mon Sep 17 00:00:00 2001
From: Henrique Joaquim
Date: Tue, 14 May 2024 08:03:17 +0100
Subject: [PATCH 01/13] [BugFix] Fix broken `--sheet-name` argument (#6401)
* remove hold command and its references
* remove --local flag as we don't use it anymore @IgorWounds
* reset package folder
* reset reference
* unnecessary line break removed
* better handling of obbjects before printing/table/chart also fixes the sheet_name issue when writing to excel
* fix linting; also, dataframe creation in the right place
* proper handling of sheet name
* orient to columns instead
---------
Co-authored-by: Danglewood <85772166+deeleeramone@users.noreply.github.com>
Co-authored-by: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com>
---
.../argparse_translator/obbject_registry.py | 4 +-
.../controllers/base_platform_controller.py | 94 ++++++++++---------
2 files changed, 54 insertions(+), 44 deletions(-)
diff --git a/cli/openbb_cli/argparse_translator/obbject_registry.py b/cli/openbb_cli/argparse_translator/obbject_registry.py
index 1c4cbf80dd9d..e1c73fd0c127 100644
--- a/cli/openbb_cli/argparse_translator/obbject_registry.py
+++ b/cli/openbb_cli/argparse_translator/obbject_registry.py
@@ -18,12 +18,14 @@ def _contains_obbject(uuid: str, obbjects: List[OBBject]) -> bool:
"""Check if obbject with uuid is in the registry."""
return any(obbject.id == uuid for obbject in obbjects)
- def register(self, obbject: OBBject):
+ def register(self, obbject: OBBject) -> bool:
"""Designed to add an OBBject instance to the registry."""
if isinstance(obbject, OBBject) and not self._contains_obbject(
obbject.id, self._obbjects
):
self._obbjects.append(obbject)
+ return True
+ return False
def get(self, idx: int) -> OBBject:
"""Return the obbject at index idx."""
diff --git a/cli/openbb_cli/controllers/base_platform_controller.py b/cli/openbb_cli/controllers/base_platform_controller.py
index c154baa56cd0..8ac12f4ed569 100644
--- a/cli/openbb_cli/controllers/base_platform_controller.py
+++ b/cli/openbb_cli/controllers/base_platform_controller.py
@@ -153,54 +153,65 @@ def method(self, other_args: List[str], translator=translator):
ns_parser = self._intersect_data_processing_commands(ns_parser)
obbject = translator.execute_func(parsed_args=ns_parser)
- df: pd.DataFrame = None
+ df: pd.DataFrame = pd.DataFrame()
fig: OpenBBFigure = None
title = f"{self.PATH}{translator.func.__name__}"
if obbject:
- if session.max_obbjects_exceeded():
- session.obbject_registry.remove()
-
- # use the obbject to store the command so we can display it later on results
- obbject.extra["command"] = f"{title} {' '.join(other_args)}"
-
- session.obbject_registry.register(obbject)
- # we need to force to re-link so that the new obbject
- # is immediately available for data processing commands
- self._link_obbject_to_data_processing_commands()
- # also update the completer
- self.update_completer(self.choices_default)
-
- if session.settings.SHOW_MSG_OBBJECT_REGISTRY and isinstance(
- obbject, OBBject
- ):
- session.console.print("Added OBBject to registry.")
-
- if hasattr(ns_parser, "chart") and ns_parser.chart:
- obbject.show()
- fig = obbject.chart.fig
- if hasattr(obbject, "to_dataframe"):
+
+ if isinstance(obbject, OBBject) and obbject.results:
+ if session.max_obbjects_exceeded():
+ session.obbject_registry.remove()
+ session.console.print(
+ "[yellow]Maximum number of OBBjects reached. The oldest entry was removed.[yellow]"
+ )
+
+ # use the obbject to store the command so we can display it later on results
+ obbject.extra["command"] = f"{title} {' '.join(other_args)}"
+
+ register_result = session.obbject_registry.register(obbject)
+
+ # we need to force to re-link so that the new obbject
+ # is immediately available for data processing commands
+ self._link_obbject_to_data_processing_commands()
+ # also update the completer
+ self.update_completer(self.choices_default)
+
+ if (
+ session.settings.SHOW_MSG_OBBJECT_REGISTRY
+ and register_result
+ ):
+ session.console.print("Added OBBject to registry.")
+
+ # making the dataframe available
+ # either for printing or exporting (or both)
df = obbject.to_dataframe()
- elif isinstance(obbject, dict):
- df = pd.DataFrame.from_dict(obbject, orient="index")
- else:
- df = None
- elif hasattr(obbject, "to_dataframe"):
- df = obbject.to_dataframe()
- if isinstance(df.columns, pd.RangeIndex):
- df.columns = [str(i) for i in df.columns]
- print_rich_table(df=df, show_index=True, title=title)
+ if hasattr(ns_parser, "chart") and ns_parser.chart:
+ obbject.show()
+ fig = obbject.chart.fig if obbject.chart else None
+ else:
+ if isinstance(df.columns, pd.RangeIndex):
+ df.columns = [str(i) for i in df.columns]
+
+ print_rich_table(df=df, show_index=True, title=title)
- elif isinstance(obbject, dict):
- df = pd.DataFrame.from_dict(obbject, orient="index")
- print_rich_table(df=df, show_index=True, title=title)
+ elif isinstance(obbject, dict):
+ df = pd.DataFrame.from_dict(obbject, orient="columns")
+ print_rich_table(df=df, show_index=True, title=title)
- elif obbject:
- session.console.print(obbject)
+ elif not isinstance(obbject, OBBject):
+ session.console.print(obbject)
- if hasattr(ns_parser, "export") and ns_parser.export:
+ if (
+ hasattr(ns_parser, "export")
+ and ns_parser.export
+ and not df.empty
+ ):
sheet_name = getattr(ns_parser, "sheet_name", None)
+ if sheet_name and isinstance(sheet_name, list):
+ sheet_name = sheet_name[0]
+
export_data(
export_type=",".join(ns_parser.export),
dir_path=os.path.dirname(os.path.abspath(__file__)),
@@ -209,11 +220,8 @@ def method(self, other_args: List[str], translator=translator):
sheet_name=sheet_name,
figure=fig,
)
-
- if session.max_obbjects_exceeded():
- session.console.print(
- "[yellow]\nMaximum number of OBBjects reached. The oldest entry was removed.[yellow]"
- )
+ elif hasattr(ns_parser, "export") and ns_parser.export and df.empty:
+ session.console.print("[yellow]No data to export.[/yellow]")
except Exception as e:
session.console.print(f"[red]{e}[/]\n")
From 29dfc7b133d44e0c8627ceb29103acada4257f9b Mon Sep 17 00:00:00 2001
From: Danglewood <85772166+deeleeramone@users.noreply.github.com>
Date: Tue, 14 May 2024 01:11:37 -0700
Subject: [PATCH 02/13] expose error message on request fail (#6406)
Co-authored-by: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com>
---
.../models/historical_eps.py | 24 +++++++++----------
1 file changed, 12 insertions(+), 12 deletions(-)
diff --git a/openbb_platform/providers/alpha_vantage/openbb_alpha_vantage/models/historical_eps.py b/openbb_platform/providers/alpha_vantage/openbb_alpha_vantage/models/historical_eps.py
index dc1a7d23c075..efc27de80e8f 100644
--- a/openbb_platform/providers/alpha_vantage/openbb_alpha_vantage/models/historical_eps.py
+++ b/openbb_platform/providers/alpha_vantage/openbb_alpha_vantage/models/historical_eps.py
@@ -2,9 +2,9 @@
# pylint: disable=unused-argument
-import warnings
from datetime import date as dateType
from typing import Any, Dict, List, Literal, Optional, Union
+from warnings import warn
from openbb_core.provider.abstract.fetcher import Fetcher
from openbb_core.provider.standard_models.historical_eps import (
@@ -20,8 +20,6 @@
)
from pydantic import Field, field_validator
-_warn = warnings.warn
-
class AlphaVantageHistoricalEpsQueryParams(HistoricalEpsQueryParams):
"""
@@ -103,17 +101,13 @@ async def aextract_data(
**kwargs: Any,
) -> List[Dict]:
"""Return the raw data from the AlphaVantage endpoint."""
-
api_key = credentials.get("alpha_vantage_api_key") if credentials else ""
-
BASE_URL = "https://www.alphavantage.co/query?function=EARNINGS&"
-
# We are allowing multiple symbols to be passed in the query, so we need to handle that.
symbols = query.symbol.split(",")
-
urls = [f"{BASE_URL}symbol={symbol}&apikey={api_key}" for symbol in symbols]
-
- results = []
+ results: List = []
+ messages: List = []
# We need to make a custom callback function for this async request.
async def response_callback(response: ClientResponse, _: ClientSession):
@@ -123,7 +117,11 @@ async def response_callback(response: ClientResponse, _: ClientSession):
target = (
"annualEarnings" if query.period == "annual" else "quarterlyEarnings"
)
- result = []
+ message = data.get("Information", "")
+ if message:
+ messages.append(message)
+ warn(f"Symbol Error for {symbol}: {message}")
+ result: List = []
# If data is returned, append it to the results list.
if data:
result = [
@@ -137,13 +135,15 @@ async def response_callback(response: ClientResponse, _: ClientSession):
results.extend(result[: query.limit])
else:
results.extend(result)
-
# If no data is returned, raise a warning and move on to the next symbol.
if not data:
- _warn(f"Symbol Error: No data found for {symbol}")
+ warn(f"Symbol Error: No data found for {symbol}")
await amake_requests(urls, response_callback, **kwargs) # type: ignore
+ if not results:
+ raise EmptyDataError(f"No data was returned -> \n{messages[-1]}")
+
return results
@staticmethod
From 2ac1af3f265d7b6c863d9b2bb86ba643819cc969 Mon Sep 17 00:00:00 2001
From: Danglewood <85772166+deeleeramone@users.noreply.github.com>
Date: Tue, 14 May 2024 03:11:59 -0700
Subject: [PATCH 03/13] [BugFix] Make `paper_bgcolor` transparent in PyWry
backend (#6385)
* make paper_bgcolor transparent in PyWry backend
* black
---------
Co-authored-by: Henrique Joaquim
---
.../charting/openbb_charting/core/backend.py | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/openbb_platform/obbject_extensions/charting/openbb_charting/core/backend.py b/openbb_platform/obbject_extensions/charting/openbb_charting/core/backend.py
index 79d4c56e18b5..fb2503afe864 100644
--- a/openbb_platform/obbject_extensions/charting/openbb_charting/core/backend.py
+++ b/openbb_platform/obbject_extensions/charting/openbb_charting/core/backend.py
@@ -198,6 +198,12 @@ def send_figure(
self.check_backend()
# pylint: disable=C0415
+ paper_bg = (
+ "rgba(0,0,0,0)"
+ if self.charting_settings.chart_style == "dark"
+ else "rgba(255,255,255,0)"
+ )
+
title = "Interactive Chart"
fig.layout.title.text = re.sub(
@@ -210,9 +216,8 @@ def send_figure(
export_image = Path(export_image).resolve()
json_data = json.loads(fig.to_json())
-
json_data.update(self.get_json_update(command_location))
-
+ json_data["layout"]["paper_bgcolor"] = paper_bg
outgoing = dict(
html=self.get_plotly_html(),
json_data=json_data,
From 17a7e7d263eeab112bc478938afdaacfe4cb5e40 Mon Sep 17 00:00:00 2001
From: Danglewood <85772166+deeleeramone@users.noreply.github.com>
Date: Tue, 14 May 2024 03:34:48 -0700
Subject: [PATCH 04/13] [BugFix] Econ Calendar (#6392)
* fix econ calendar
* black
* more black
* pylint
* add 1 to n_urls
* set default dates in transform query
* missing decorator
* add None to literal
* literals
---------
Co-authored-by: Henrique Joaquim
Co-authored-by: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com>
---
.../standard_models/economic_calendar.py | 30 +-
.../economy/integration/test_economy_api.py | 5 +-
.../integration/test_economy_python.py | 11 +-
openbb_platform/openbb/assets/reference.json | 140 +-
openbb_platform/openbb/package/economy.py | 64 +-
.../openbb_fmp/models/economic_calendar.py | 99 +-
.../test_fmp_economic_calendar_fetcher.yaml | 2813 +++++++++++++++--
.../providers/fmp/tests/test_fmp_fetchers.py | 2 +-
.../models/economic_calendar.py | 137 +-
.../utils/url_generator.py | 7 +
10 files changed, 2971 insertions(+), 337 deletions(-)
diff --git a/openbb_platform/core/openbb_core/provider/standard_models/economic_calendar.py b/openbb_platform/core/openbb_core/provider/standard_models/economic_calendar.py
index 46aa718024b4..67a268ce2b2f 100644
--- a/openbb_platform/core/openbb_core/provider/standard_models/economic_calendar.py
+++ b/openbb_platform/core/openbb_core/provider/standard_models/economic_calendar.py
@@ -4,7 +4,7 @@
date as dateType,
datetime,
)
-from typing import Literal, Optional, Union
+from typing import Optional, Union
from pydantic import Field
@@ -36,30 +36,26 @@ class EconomicCalendarData(Data):
default=None, description=DATA_DESCRIPTIONS.get("date", "")
)
country: Optional[str] = Field(default=None, description="Country of event.")
+ category: Optional[str] = Field(default=None, description="Category of event.")
event: Optional[str] = Field(default=None, description="Event name.")
- reference: Optional[str] = Field(
- default=None,
- description="Abbreviated period for which released data refers to.",
+ importance: Optional[str] = Field(
+ default=None, description="The importance level for the event."
)
source: Optional[str] = Field(default=None, description="Source of the data.")
- sourceurl: Optional[str] = Field(default=None, description="Source URL.")
- actual: Optional[Union[str, float]] = Field(
- default=None, description="Latest released value."
+ currency: Optional[str] = Field(default=None, description="Currency of the data.")
+ unit: Optional[str] = Field(default=None, description="Unit of the data.")
+ consensus: Optional[Union[str, float]] = Field(
+ default=None,
+ description="Average forecast among a representative group of economists.",
)
previous: Optional[Union[str, float]] = Field(
default=None,
description="Value for the previous period after the revision (if revision is applicable).",
)
- consensus: Optional[Union[str, float]] = Field(
+ revised: Optional[Union[str, float]] = Field(
default=None,
- description="Average forecast among a representative group of economists.",
+ description="Revised previous value, if applicable.",
)
- forecast: Optional[Union[str, float]] = Field(
- default=None, description="Trading Economics projections"
- )
- url: Optional[str] = Field(default=None, description="Trading Economics URL")
- importance: Optional[Union[Literal[0, 1, 2, 3], str]] = Field(
- default=None, description="Importance of the event. 1-Low, 2-Medium, 3-High"
+ actual: Optional[Union[str, float]] = Field(
+ default=None, description="Latest released value."
)
- currency: Optional[str] = Field(default=None, description="Currency of the data.")
- unit: Optional[str] = Field(default=None, description="Unit of the data.")
diff --git a/openbb_platform/extensions/economy/integration/test_economy_api.py b/openbb_platform/extensions/economy/integration/test_economy_api.py
index 54ea5f6148f4..f8de0ee5ca12 100644
--- a/openbb_platform/extensions/economy/integration/test_economy_api.py
+++ b/openbb_platform/extensions/economy/integration/test_economy_api.py
@@ -39,13 +39,16 @@ def headers():
"start_date": "2023-01-01",
"end_date": "2023-06-06",
"country": "mexico,sweden",
- "importance": "Low",
+ "importance": "low",
"group": "gdp",
+ "calendar_id": None,
}
),
(
{
"provider": "fmp",
+ "start_date": "2023-10-24",
+ "end_date": "2023-11-03",
}
),
],
diff --git a/openbb_platform/extensions/economy/integration/test_economy_python.py b/openbb_platform/extensions/economy/integration/test_economy_python.py
index 9a9eb1e35bd4..dec33dacb6ee 100644
--- a/openbb_platform/extensions/economy/integration/test_economy_python.py
+++ b/openbb_platform/extensions/economy/integration/test_economy_python.py
@@ -21,7 +21,6 @@ def obb(pytestconfig): # pylint: disable=inconsistent-return-statements
@parametrize(
"params",
[
- ({"start_date": "2023-01-01", "end_date": "2023-06-06", "provider": "fmp"}),
(
{
"provider": "nasdaq",
@@ -36,8 +35,16 @@ def obb(pytestconfig): # pylint: disable=inconsistent-return-statements
"start_date": "2023-01-01",
"end_date": "2023-06-06",
"country": "mexico,sweden",
- "importance": "Medium",
+ "importance": "low",
"group": "gdp",
+ "calendar_id": None,
+ }
+ ),
+ (
+ {
+ "provider": "fmp",
+ "start_date": "2023-10-24",
+ "end_date": "2023-11-03",
}
),
],
diff --git a/openbb_platform/openbb/assets/reference.json b/openbb_platform/openbb/assets/reference.json
index 5ff26093f056..febb1baad07d 100644
--- a/openbb_platform/openbb/assets/reference.json
+++ b/openbb_platform/openbb/assets/reference.json
@@ -2211,15 +2211,22 @@
},
{
"name": "importance",
- "type": "Literal['Low', 'Medium', 'High']",
+ "type": "Literal['low', 'medium', 'high']",
"description": "Importance of the event.",
"default": null,
"optional": true
},
{
"name": "group",
- "type": "Literal['interest rate', 'inflation', 'bonds', 'consumer', 'gdp', 'government', 'housing', 'labour', 'markets', 'money', 'prices', 'trade', 'business']",
- "description": "Grouping of events",
+ "type": "Literal['interest_rate', 'inflation', 'bonds', 'consumer', 'gdp', 'government', 'housing', 'labour', 'markets', 'money', 'prices', 'trade', 'business']",
+ "description": "Grouping of events.",
+ "default": null,
+ "optional": true
+ },
+ {
+ "name": "calendar_id",
+ "type": "Union[Union[int, str], List[Union[int, str]]]",
+ "description": "Get events by TradingEconomics Calendar ID. Multiple items allowed for provider(s): tradingeconomics.",
"default": null,
"optional": true
}
@@ -2270,6 +2277,13 @@
"default": null,
"optional": true
},
+ {
+ "name": "category",
+ "type": "str",
+ "description": "Category of event.",
+ "default": null,
+ "optional": true
+ },
{
"name": "event",
"type": "str",
@@ -2278,9 +2292,9 @@
"optional": true
},
{
- "name": "reference",
+ "name": "importance",
"type": "str",
- "description": "Abbreviated period for which released data refers to.",
+ "description": "The importance level for the event.",
"default": null,
"optional": true
},
@@ -2292,16 +2306,23 @@
"optional": true
},
{
- "name": "sourceurl",
+ "name": "currency",
"type": "str",
- "description": "Source URL.",
+ "description": "Currency of the data.",
"default": null,
"optional": true
},
{
- "name": "actual",
+ "name": "unit",
+ "type": "str",
+ "description": "Unit of the data.",
+ "default": null,
+ "optional": true
+ },
+ {
+ "name": "consensus",
"type": "Union[str, float]",
- "description": "Latest released value.",
+ "description": "Average forecast among a representative group of economists.",
"default": null,
"optional": true
},
@@ -2313,79 +2334,122 @@
"optional": true
},
{
- "name": "consensus",
+ "name": "revised",
"type": "Union[str, float]",
- "description": "Average forecast among a representative group of economists.",
+ "description": "Revised previous value, if applicable.",
"default": null,
"optional": true
},
+ {
+ "name": "actual",
+ "type": "Union[str, float]",
+ "description": "Latest released value.",
+ "default": null,
+ "optional": true
+ }
+ ],
+ "fmp": [
+ {
+ "name": "change",
+ "type": "float",
+ "description": "Value change since previous.",
+ "default": null,
+ "optional": true
+ },
+ {
+ "name": "change_percent",
+ "type": "float",
+ "description": "Percentage change since previous.",
+ "default": null,
+ "optional": true
+ },
+ {
+ "name": "last_updated",
+ "type": "datetime",
+ "description": "Last updated timestamp.",
+ "default": null,
+ "optional": true
+ },
+ {
+ "name": "created_at",
+ "type": "datetime",
+ "description": "Created at timestamp.",
+ "default": null,
+ "optional": true
+ }
+ ],
+ "tradingeconomics": [
{
"name": "forecast",
"type": "Union[str, float]",
- "description": "Trading Economics projections",
+ "description": "TradingEconomics projections.",
"default": null,
"optional": true
},
{
- "name": "url",
+ "name": "reference",
"type": "str",
- "description": "Trading Economics URL",
+ "description": "Abbreviated period for which released data refers to.",
"default": null,
"optional": true
},
{
- "name": "importance",
- "type": "Union[Literal[0, 1, 2, 3], str]",
- "description": "Importance of the event. 1-Low, 2-Medium, 3-High",
+ "name": "reference_date",
+ "type": "date",
+ "description": "Date for the reference period.",
"default": null,
"optional": true
},
{
- "name": "currency",
- "type": "str",
- "description": "Currency of the data.",
+ "name": "calendar_id",
+ "type": "int",
+ "description": "TradingEconomics Calendar ID.",
"default": null,
"optional": true
},
{
- "name": "unit",
+ "name": "date_span",
+ "type": "int",
+ "description": "Date span of the event.",
+ "default": null,
+ "optional": true
+ },
+ {
+ "name": "symbol",
"type": "str",
- "description": "Unit of the data.",
+ "description": "TradingEconomics Symbol.",
"default": null,
"optional": true
- }
- ],
- "fmp": [
+ },
{
- "name": "change",
- "type": "float",
- "description": "Value change since previous.",
+ "name": "ticker",
+ "type": "str",
+ "description": "TradingEconomics Ticker symbol.",
"default": null,
"optional": true
},
{
- "name": "change_percent",
- "type": "float",
- "description": "Percentage change since previous.",
+ "name": "te_url",
+ "type": "str",
+ "description": "TradingEconomics URL path.",
"default": null,
"optional": true
},
{
- "name": "updated_at",
- "type": "datetime",
- "description": "Last updated timestamp.",
+ "name": "source_url",
+ "type": "str",
+ "description": "Source URL.",
"default": null,
"optional": true
},
{
- "name": "created_at",
+ "name": "last_updated",
"type": "datetime",
- "description": "Created at timestamp.",
+ "description": "Last update of the data.",
"default": null,
"optional": true
}
- ],
- "tradingeconomics": []
+ ]
},
"model": "EconomicCalendar"
},
diff --git a/openbb_platform/openbb/package/economy.py b/openbb_platform/openbb/package/economy.py
index dca7a2a489c4..fcf6f22d4c80 100644
--- a/openbb_platform/openbb/package/economy.py
+++ b/openbb_platform/openbb/package/economy.py
@@ -156,10 +156,12 @@ def calendar(
no default.
country : Optional[str]
Country of the event. Multiple comma separated items allowed. (provider: tradingeconomics)
- importance : Optional[Literal['Low', 'Medium', 'High']]
+ importance : Optional[Literal['low', 'medium', 'high']]
Importance of the event. (provider: tradingeconomics)
- group : Optional[Literal['interest rate', 'inflation', 'bonds', 'consumer', 'gdp', 'government', 'housing', 'labour', 'markets', 'money', 'prices', 'trade', 'business']]
- Grouping of events (provider: tradingeconomics)
+ group : Optional[Literal['interest_rate', 'inflation', 'bonds', 'consumer', 'gdp', 'government', 'housing', 'labour', 'markets', 'money', 'prices', 'trade', 'business']]
+ Grouping of events. (provider: tradingeconomics)
+ calendar_id : Optional[Union[int, str]]
+ Get events by TradingEconomics Calendar ID. Multiple comma separated items allowed. (provider: tradingeconomics)
Returns
-------
@@ -181,38 +183,53 @@ def calendar(
The date of the data.
country : Optional[str]
Country of event.
+ category : Optional[str]
+ Category of event.
event : Optional[str]
Event name.
- reference : Optional[str]
- Abbreviated period for which released data refers to.
+ importance : Optional[str]
+ The importance level for the event.
source : Optional[str]
Source of the data.
- sourceurl : Optional[str]
- Source URL.
- actual : Optional[Union[str, float]]
- Latest released value.
- previous : Optional[Union[str, float]]
- Value for the previous period after the revision (if revision is applicable).
- consensus : Optional[Union[str, float]]
- Average forecast among a representative group of economists.
- forecast : Optional[Union[str, float]]
- Trading Economics projections
- url : Optional[str]
- Trading Economics URL
- importance : Optional[Union[Literal[0, 1, 2, 3], str]]
- Importance of the event. 1-Low, 2-Medium, 3-High
currency : Optional[str]
Currency of the data.
unit : Optional[str]
Unit of the data.
+ consensus : Optional[Union[str, float]]
+ Average forecast among a representative group of economists.
+ previous : Optional[Union[str, float]]
+ Value for the previous period after the revision (if revision is applicable).
+ revised : Optional[Union[str, float]]
+ Revised previous value, if applicable.
+ actual : Optional[Union[str, float]]
+ Latest released value.
change : Optional[float]
Value change since previous. (provider: fmp)
change_percent : Optional[float]
Percentage change since previous. (provider: fmp)
- updated_at : Optional[datetime]
- Last updated timestamp. (provider: fmp)
+ last_updated : Optional[datetime]
+ Last updated timestamp. (provider: fmp);
+ Last update of the data. (provider: tradingeconomics)
created_at : Optional[datetime]
Created at timestamp. (provider: fmp)
+ forecast : Optional[Union[str, float]]
+ TradingEconomics projections. (provider: tradingeconomics)
+ reference : Optional[str]
+ Abbreviated period for which released data refers to. (provider: tradingeconomics)
+ reference_date : Optional[date]
+ Date for the reference period. (provider: tradingeconomics)
+ calendar_id : Optional[int]
+ TradingEconomics Calendar ID. (provider: tradingeconomics)
+ date_span : Optional[int]
+ Date span of the event. (provider: tradingeconomics)
+ symbol : Optional[str]
+ TradingEconomics Symbol. (provider: tradingeconomics)
+ ticker : Optional[str]
+ TradingEconomics Ticker symbol. (provider: tradingeconomics)
+ te_url : Optional[str]
+ TradingEconomics URL path. (provider: tradingeconomics)
+ source_url : Optional[str]
+ Source URL. (provider: tradingeconomics)
Examples
--------
@@ -238,7 +255,10 @@ def calendar(
},
extra_params=kwargs,
info={
- "country": {"tradingeconomics": {"multiple_items_allowed": True}}
+ "country": {"tradingeconomics": {"multiple_items_allowed": True}},
+ "calendar_id": {
+ "tradingeconomics": {"multiple_items_allowed": True}
+ },
},
)
)
diff --git a/openbb_platform/providers/fmp/openbb_fmp/models/economic_calendar.py b/openbb_platform/providers/fmp/openbb_fmp/models/economic_calendar.py
index ba7b33065485..135aaa043144 100644
--- a/openbb_platform/providers/fmp/openbb_fmp/models/economic_calendar.py
+++ b/openbb_platform/providers/fmp/openbb_fmp/models/economic_calendar.py
@@ -1,7 +1,11 @@
"""FMP Economic Calendar Model."""
-from datetime import datetime
+# pylint: disable=unused-argument
+
+import asyncio
+from datetime import datetime, timedelta
from typing import Any, Dict, List, Optional
+from warnings import warn
from openbb_core.provider.abstract.fetcher import Fetcher
from openbb_core.provider.standard_models.economic_calendar import (
@@ -9,7 +13,7 @@
EconomicCalendarQueryParams,
)
from openbb_core.provider.utils.helpers import amake_request
-from pydantic import Field, field_validator
+from pydantic import Field, field_validator, model_validator
class FMPEconomicCalendarQueryParams(EconomicCalendarQueryParams):
@@ -25,7 +29,13 @@ class FMPEconomicCalendarData(EconomicCalendarData):
Source: https://site.financialmodelingprep.com/developer/docs/economic-calendar-api
"""
- __alias_dict__ = {"consensus": "estimate", "importance": "impact"}
+ __alias_dict__ = {
+ "consensus": "estimate",
+ "importance": "impact",
+ "last_updated": "updatedAt",
+ "created_at": "createdAt",
+ "change_percent": "changePercentage",
+ }
change: Optional[float] = Field(
description="Value change since previous.",
@@ -34,29 +44,31 @@ class FMPEconomicCalendarData(EconomicCalendarData):
change_percent: Optional[float] = Field(
description="Percentage change since previous.",
default=None,
- alias="changePercentage",
)
- updated_at: Optional[datetime] = Field(
- description="Last updated timestamp.", default=None, alias="updatedAt"
+ last_updated: Optional[datetime] = Field(
+ description="Last updated timestamp.", default=None
)
created_at: Optional[datetime] = Field(
- description="Created at timestamp.", default=None, alias="createdAt"
+ description="Created at timestamp.", default=None
)
- @field_validator("date", mode="before", check_fields=False)
- def date_validate(cls, v: str): # pylint: disable=E0213
- """Return the date as a datetime object."""
- return datetime.strptime(v, "%Y-%m-%d %H:%M:%S") if v else None
-
- @field_validator("updatedAt", mode="before", check_fields=False)
- def updated_at_validate(cls, v: str): # pylint: disable=E0213
+ @field_validator(
+ "date", "last_updated", "created_at", mode="before", check_fields=False
+ )
+ @classmethod
+ def date_validate(cls, v: str):
"""Return the date as a datetime object."""
return datetime.strptime(v, "%Y-%m-%d %H:%M:%S") if v else None
- @field_validator("createdAt", mode="before", check_fields=False)
- def created_at_validate(cls, v: str): # pylint: disable=E0213
- """Return the date ending as a datetime object."""
- return datetime.strptime(v, "%Y-%m-%d %H:%M:%S") if v else None
+ @model_validator(mode="before")
+ @classmethod
+ def empty_strings(cls, values):
+ """Replace empty values with None."""
+ return (
+ {k: (None if v in ("", 0) else v) for k, v in values.items()}
+ if isinstance(values, dict)
+ else values
+ )
class FMPEconomicCalendarFetcher(
@@ -70,13 +82,12 @@ class FMPEconomicCalendarFetcher(
@staticmethod
def transform_query(params: Dict[str, Any]) -> FMPEconomicCalendarQueryParams:
"""Transform the query."""
- if params:
- if params["start_date"] is None:
- params["start_date"] = datetime.now().strftime("%Y-%m-%d")
- if params["end_date"] is None:
- params["end_date"] = datetime.now().strftime("%Y-%m-%d")
-
- return FMPEconomicCalendarQueryParams(**params)
+ transformed_params = params
+ if not transformed_params.get("start_date"):
+ transformed_params["start_date"] = datetime.now().date()
+ if not transformed_params.get("end_date"):
+ transformed_params["end_date"] = (datetime.now() + timedelta(days=7)).date()
+ return FMPEconomicCalendarQueryParams(**transformed_params)
@staticmethod
async def aextract_data(
@@ -89,11 +100,41 @@ async def aextract_data(
base_url = "https://financialmodelingprep.com/api/v3/economic_calendar?"
- url = f"{base_url}from={query.start_date}&to={query.end_date}&apikey={api_key}"
-
- return await amake_request(url, **kwargs)
+ # FMP allows only 3-month windows to be queried, we need to chunk to request.
+ def date_range(start_date, end_date):
+ """Yield start and end dates for each 90-day period between start_date and end_date."""
+ delta = timedelta(days=90)
+ current_date = start_date
+ while current_date < end_date:
+ next_date = min(current_date + delta, end_date)
+ yield current_date, next_date
+ current_date = next_date + timedelta(days=1)
+
+ date_ranges = list(date_range(query.start_date, query.end_date))
+ urls = [
+ f"{base_url}from={start_date.strftime('%Y-%m-%d')}&to={end_date.strftime('%Y-%m-%d')}&apikey={api_key}"
+ for start_date, end_date in date_ranges
+ ]
+ results: List[Dict] = []
+
+ # We need to do this because Pytest does not seem to be able to handle `amake_requests`.
+ async def get_one(url):
+ """Get data for one URL."""
+ n_urls = 1
+ try:
+ result = await amake_request(url, **kwargs)
+ if result:
+ results.extend(result)
+ except Exception as e:
+ if len(urls) == 1 or (len(urls) > 1 and n_urls == len(urls)):
+ raise e from e
+ warn(f"Error in fetching part of the data from FMP -> {e}")
+ n_urls += 1
+
+ await asyncio.gather(*[get_one(url) for url in urls])
+
+ return results
- # pylint: disable=unused-argument
@staticmethod
def transform_data(
query: FMPEconomicCalendarQueryParams,
diff --git a/openbb_platform/providers/fmp/tests/record/http/test_fmp_fetchers/test_fmp_economic_calendar_fetcher.yaml b/openbb_platform/providers/fmp/tests/record/http/test_fmp_fetchers/test_fmp_economic_calendar_fetcher.yaml
index ecc1f2aa9373..c5f7c0682dc2 100644
--- a/openbb_platform/providers/fmp/tests/record/http/test_fmp_fetchers/test_fmp_economic_calendar_fetcher.yaml
+++ b/openbb_platform/providers/fmp/tests/record/http/test_fmp_fetchers/test_fmp_economic_calendar_fetcher.yaml
@@ -3,221 +3,2622 @@ interactions:
body: null
headers:
Accept:
- - '*/*'
+ - application/json
Accept-Encoding:
- - gzip, deflate, br
+ - gzip, deflate
Connection:
- keep-alive
method: GET
- uri: https://financialmodelingprep.com/api/v3/economic_calendar?apikey=MOCK_API_KEY&from=None&to=None
+ uri: https://financialmodelingprep.com/api/v3/economic_calendar?apikey=MOCK_API_KEY&from=2024-01-01&to=2024-03-30
response:
body:
string: !!binary |
- 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
- IxKKoscjIQb4t//x33y9B2LyhAIA
+ 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
headers:
Access-Control-Allow-Credentials:
- 'true'
Access-Control-Allow-Headers:
- X-Requested-With, content-type, auth-token, Authorization, stripe-signature,
- APPS
+ APPS, publicauthkey, privateauthkey
Access-Control-Allow-Methods:
- GET, POST, OPTIONS
Access-Control-Allow-Origin:
@@ -231,9 +2632,9 @@ interactions:
Content-Type:
- application/json; charset=utf-8
Date:
- - Wed, 18 Oct 2023 22:40:55 GMT
- ETag:
- - W/"284f2-FW6cFRSgarMvF+hXnmvDQcv3XUE"
+ - Fri, 10 May 2024 20:03:01 GMT
+ Etag:
+ - W/"16694f-36I863eGyYRjhoSr6dcFYlERS4o"
Server:
- nginx/1.18.0 (Ubuntu)
Transfer-Encoding:
diff --git a/openbb_platform/providers/fmp/tests/test_fmp_fetchers.py b/openbb_platform/providers/fmp/tests/test_fmp_fetchers.py
index f64d42875797..b740b6e8050f 100644
--- a/openbb_platform/providers/fmp/tests/test_fmp_fetchers.py
+++ b/openbb_platform/providers/fmp/tests/test_fmp_fetchers.py
@@ -562,7 +562,7 @@ def test_fmp_financial_ratios_fetcher(credentials=test_credentials):
@pytest.mark.record_http
def test_fmp_economic_calendar_fetcher(credentials=test_credentials):
"""Test FMP economic calendar fetcher."""
- params = {}
+ params = {"start_date": date(2024, 1, 1), "end_date": date(2024, 3, 30)}
fetcher = FMPEconomicCalendarFetcher()
result = fetcher.test(params, credentials)
diff --git a/openbb_platform/providers/tradingeconomics/openbb_tradingeconomics/models/economic_calendar.py b/openbb_platform/providers/tradingeconomics/openbb_tradingeconomics/models/economic_calendar.py
index 25a2a0457986..e19cd3eb1f4a 100644
--- a/openbb_platform/providers/tradingeconomics/openbb_tradingeconomics/models/economic_calendar.py
+++ b/openbb_platform/providers/tradingeconomics/openbb_tradingeconomics/models/economic_calendar.py
@@ -1,6 +1,11 @@
"""Trading Economics Economic Calendar Model."""
-from datetime import datetime
+# pylint: disable=unused-argument
+
+from datetime import (
+ date as dateType,
+ datetime,
+)
from typing import Any, Dict, List, Literal, Optional, Union
from warnings import warn
@@ -13,12 +18,30 @@
from openbb_tradingeconomics.utils import url_generator
from openbb_tradingeconomics.utils.countries import COUNTRIES
from pandas import to_datetime
-from pydantic import Field, field_validator
+from pydantic import Field, field_validator, model_validator
+
+IMPORTANCE_CHOICES = ["low", "medium", "high"]
-IMPORTANCE = Literal["Low", "Medium", "High"]
+IMPORTANCE = Literal["low", "medium", "high"]
+
+GROUPS_CHOICES = [
+ "interest_rate",
+ "inflation",
+ "bonds",
+ "consumer",
+ "gdp",
+ "government",
+ "housing",
+ "labour",
+ "markets",
+ "money",
+ "prices",
+ "trade",
+ "business",
+]
GROUPS = Literal[
- "interest rate",
+ "interest_rate",
"inflation",
"bonds",
"consumer",
@@ -32,6 +55,7 @@
"trade",
"business",
]
+
TE_COUNTRY_LIMIT = 28
@@ -41,15 +65,28 @@ class TEEconomicCalendarQueryParams(EconomicCalendarQueryParams):
Source: https://docs.tradingeconomics.com/economic_calendar/
"""
- __json_schema_extra__ = {"country": {"multiple_items_allowed": True}}
-
- # TODO: Probably want to figure out the list we can use.
- country: Optional[str] = Field(default=None, description="Country of the event.")
+ __json_schema_extra__ = {
+ "country": {"multiple_items_allowed": True},
+ "calendar_id": {"multiple_items_allowed": True},
+ }
+ country: Optional[str] = Field(
+ default=None,
+ description="Country of the event.",
+ json_schema_extra={"choices": COUNTRIES}, # type: ignore[dict-item]
+ )
importance: Optional[IMPORTANCE] = Field(
- default=None, description="Importance of the event."
+ default=None,
+ description="Importance of the event.",
+ json_schema_extra={"choices": IMPORTANCE_CHOICES}, # type: ignore[dict-item]
+ )
+ group: Optional[GROUPS] = Field(
+ default=None,
+ description="Grouping of events.",
+ json_schema_extra={"choices": GROUPS_CHOICES}, # type: ignore[dict-item]
+ )
+ calendar_id: Optional[Union[int, str]] = Field(
+ default=None, description="Get events by TradingEconomics Calendar ID."
)
- group: Optional[GROUPS] = Field(default=None, description="Grouping of events")
-
_number_of_countries: int = 0
@field_validator("country", mode="before", check_fields=False)
@@ -70,12 +107,12 @@ def validate_country(cls, c: str): # pylint: disable=E0213
return ",".join(result)
- @field_validator("importance")
+ @field_validator("importance", mode="after", check_fields=False)
@classmethod
def importance_to_number(cls, v):
"""Convert importance to number."""
- string_to_value = {"Low": 1, "Medium": 2, "High": 3}
- return string_to_value.get(v, None)
+ string_to_value = {"low": 1, "medium": 2, "high": 3}
+ return string_to_value.get(v.lower(), None) if v else None
class TEEconomicCalendarData(EconomicCalendarData):
@@ -87,12 +124,13 @@ class TEEconomicCalendarData(EconomicCalendarData):
"category": "Category",
"event": "Event",
"reference": "Reference",
+ "reference_date": "ReferenceDate",
"source": "Source",
- "sourceurl": "SourceURL",
+ "source_url": "SourceURL",
"actual": "Actual",
"consensus": "Forecast",
"forecast": "TEForecast",
- "url": "URL",
+ "te_url": "URL",
"importance": "Importance",
"currency": "Currency",
"unit": "Unit",
@@ -100,13 +138,70 @@ class TEEconomicCalendarData(EconomicCalendarData):
"symbol": "Symbol",
"previous": "Previous",
"revised": "Revised",
+ "last_updated": "LastUpdate",
+ "calendar_id": "CalendarId",
+ "date_span": "DateSpan",
}
+ forecast: Optional[Union[str, float]] = Field(
+ default=None, description="TradingEconomics projections."
+ )
+ reference: Optional[str] = Field(
+ default=None,
+ description="Abbreviated period for which released data refers to.",
+ )
+ reference_date: Optional[dateType] = Field(
+ default=None, description="Date for the reference period."
+ )
+ calendar_id: Optional[int] = Field(
+ default=None, description="TradingEconomics Calendar ID."
+ )
+ date_span: Optional[int] = Field(
+ default=None, description="Date span of the event."
+ )
+ symbol: Optional[str] = Field(default=None, description="TradingEconomics Symbol.")
+ ticker: Optional[str] = Field(
+ default=None, description="TradingEconomics Ticker symbol."
+ )
+ te_url: Optional[str] = Field(
+ default=None, description="TradingEconomics URL path."
+ )
+ source_url: Optional[str] = Field(default=None, description="Source URL.")
+ last_updated: Optional[datetime] = Field(
+ default=None, description="Last update of the data."
+ )
+
+ @field_validator("importance", mode="before", check_fields=False)
+ @classmethod
+ def importance_to_number(cls, v):
+ """Convert importance to number."""
+ value_to_string = {1: "Low", 2: "Medium", 3: "High"}
+ return value_to_string.get(v, None) if v else None
- @field_validator("date", mode="before")
+ @field_validator("date", "last_updated", mode="before", check_fields=False)
@classmethod
- def validate_date(cls, v: str) -> datetime:
+ def validate_datetime(cls, v: str) -> datetime:
+ """Validate the datetime values."""
+ dt = to_datetime(v, utc=True)
+ return dt.replace(microsecond=0)
+
+ @field_validator("reference_date", mode="before", check_fields=False)
+ @classmethod
+ def validate_date(cls, v: str) -> dateType:
"""Validate the date."""
- return to_datetime(v, utc=True)
+ return to_datetime(v, utc=True).date() if v else None
+
+ @model_validator(mode="before")
+ @classmethod
+ def empty_strings(cls, values): # pylint: disable=no-self-argument
+ """Replace empty strings with None."""
+ return (
+ {
+ k: None if isinstance(v, str) and v == "" else v
+ for k, v in values.items()
+ }
+ if isinstance(values, dict)
+ else values
+ )
class TEEconomicCalendarFetcher(
@@ -130,7 +225,8 @@ async def aextract_data(
) -> Union[dict, List[dict]]:
"""Return the raw data from the TE endpoint."""
api_key = credentials.get("tradingeconomics_api_key") if credentials else ""
-
+ if query.group is not None:
+ query.group = query.group.replace("_", " ") # type: ignore
url = url_generator.generate_url(query)
if not url:
raise RuntimeError(
@@ -149,7 +245,6 @@ async def callback(response: ClientResponse, _: Any) -> Union[dict, List[dict]]:
return await amake_request(url, response_callback=callback, **kwargs)
- # pylint: disable=unused-argument
@staticmethod
def transform_data(
query: TEEconomicCalendarQueryParams, data: List[Dict], **kwargs: Any
diff --git a/openbb_platform/providers/tradingeconomics/openbb_tradingeconomics/utils/url_generator.py b/openbb_platform/providers/tradingeconomics/openbb_tradingeconomics/utils/url_generator.py
index f9063ecd2594..7ec2bb20105b 100644
--- a/openbb_platform/providers/tradingeconomics/openbb_tradingeconomics/utils/url_generator.py
+++ b/openbb_platform/providers/tradingeconomics/openbb_tradingeconomics/utils/url_generator.py
@@ -16,6 +16,7 @@ def check_args(query_args: Dict, to_include: List[str]):
)
+# pylint: disable = R0912
def generate_url(in_query):
"""Generate the url for trading economimcs.
@@ -62,6 +63,9 @@ def generate_url(in_query):
# Country + Group + Date
elif check_args(query, ["country", "group", "start_date", "end_date"]):
url = f'{base_url}/country/{country}/group/{group}/{query["start_date"]}/{query["end_date"]}?c='
+ # Country + Date + Importance
+ elif check_args(query, ["country", "importance", "start_date", "end_date"]):
+ url = f'{base_url}/country/{country}/{query["start_date"]}/{query["end_date"]}?{urlencode(query)}&c='
# By date only
elif check_args(query, ["start_date", "end_date"]):
url = f'{base_url}/country/All/{query["start_date"]}/{query["end_date"]}?c='
@@ -84,5 +88,8 @@ def generate_url(in_query):
start_date = query["start_date"]
end_date = query["end_date"]
url = f"{base_url}/country/{country}/group/{group}/{start_date}/{end_date}?{urlencode(query)}&c="
+ # Calendar IDs
+ elif check_args(query, ["calendar_id"]):
+ url = f'{base_url}/calendarid/{str(query["calendar_id"])}?c='
return url if url else ""
From 0eee602098d9b783ec0df03c464ee6bc1da4d9bf Mon Sep 17 00:00:00 2001
From: Danglewood <85772166+deeleeramone@users.noreply.github.com>
Date: Tue, 14 May 2024 03:49:29 -0700
Subject: [PATCH 05/13] [Feature] Add Forward PE Estimates (#6398)
* forward_pe
* ruff
* merge branch develop
* mypy
* typo
---------
Co-authored-by: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com>
Co-authored-by: montezdesousa <79287829+montezdesousa@users.noreply.github.com>
---
.../standard_models/forward_pe_estimates.py | 54 +++++++
.../equity/integration/test_equity_api.py | 29 ++++
.../equity/integration/test_equity_python.py | 28 ++++
.../estimates/estimates_router.py | 22 +++
openbb_platform/openbb/assets/reference.json | 133 +++++++++++++++++
.../openbb/package/equity_estimates.py | 92 ++++++++++++
.../intrinio/openbb_intrinio/__init__.py | 4 +
.../models/forward_pe_estimates.py | 141 ++++++++++++++++++
.../test_intrinio_forward_pe_fetcher.yaml | 70 +++++++++
.../intrinio/tests/test_intrinio_fetchers.py | 13 ++
10 files changed, 586 insertions(+)
create mode 100644 openbb_platform/core/openbb_core/provider/standard_models/forward_pe_estimates.py
create mode 100644 openbb_platform/providers/intrinio/openbb_intrinio/models/forward_pe_estimates.py
create mode 100644 openbb_platform/providers/intrinio/tests/record/http/test_intrinio_fetchers/test_intrinio_forward_pe_fetcher.yaml
diff --git a/openbb_platform/core/openbb_core/provider/standard_models/forward_pe_estimates.py b/openbb_platform/core/openbb_core/provider/standard_models/forward_pe_estimates.py
new file mode 100644
index 000000000000..8888ce2ce2b6
--- /dev/null
+++ b/openbb_platform/core/openbb_core/provider/standard_models/forward_pe_estimates.py
@@ -0,0 +1,54 @@
+"""Forward PE Estimates Standard Model."""
+
+from typing import Optional
+
+from pydantic import Field, field_validator
+
+from openbb_core.provider.abstract.data import Data
+from openbb_core.provider.abstract.query_params import QueryParams
+from openbb_core.provider.utils.descriptions import (
+ DATA_DESCRIPTIONS,
+ QUERY_DESCRIPTIONS,
+)
+
+
+class ForwardPeEstimatesQueryParams(QueryParams):
+ """Forward PE Estimates Query Parameters."""
+
+ symbol: Optional[str] = Field(
+ default=None,
+ description=QUERY_DESCRIPTIONS["symbol"],
+ )
+
+ @field_validator("symbol", mode="before", check_fields=False)
+ @classmethod
+ def to_upper(cls, v):
+ """Convert field to uppercase."""
+ return v.upper() if v else None
+
+
+class ForwardPeEstimatesData(Data):
+ """Forward PE Estimates Data."""
+
+ symbol: str = Field(description=DATA_DESCRIPTIONS.get("symbol", ""))
+ name: Optional[str] = Field(default=None, description="Name of the entity.")
+ year1: Optional[float] = Field(
+ default=None,
+ description="Estimated PE ratio for the next fiscal year.",
+ )
+ year2: Optional[float] = Field(
+ default=None,
+ description="Estimated PE ratio two fiscal years from now.",
+ )
+ year3: Optional[float] = Field(
+ default=None,
+ description="Estimated PE ratio three fiscal years from now.",
+ )
+ year4: Optional[float] = Field(
+ default=None,
+ description="Estimated PE ratio four fiscal years from now.",
+ )
+ year5: Optional[float] = Field(
+ default=None,
+ description="Estimated PE ratio five fiscal years from now.",
+ )
diff --git a/openbb_platform/extensions/equity/integration/test_equity_api.py b/openbb_platform/extensions/equity/integration/test_equity_api.py
index 8159874b4374..ad38630c0693 100644
--- a/openbb_platform/extensions/equity/integration/test_equity_api.py
+++ b/openbb_platform/extensions/equity/integration/test_equity_api.py
@@ -1953,3 +1953,32 @@ def test_equity_ownership_form_13f(params, headers):
result = requests.get(url, headers=headers, timeout=10)
assert isinstance(result, requests.Response)
assert result.status_code == 200
+
+
+@parametrize(
+ "params",
+ [
+ (
+ {
+ "symbol": "NVDA,MSFT",
+ "provider": "intrinio",
+ }
+ ),
+ (
+ {
+ "symbol": None,
+ "provider": "intrinio",
+ }
+ ),
+ ],
+)
+@pytest.mark.integration
+def test_equity_estimates_forward_pe(params, headers):
+ """Test the equity estimates forward_pe endpoint."""
+ params = {p: v for p, v in params.items() if v}
+
+ query_str = get_querystring(params, [])
+ url = f"http://0.0.0.0:8000/api/v1/equity/estimates/forward_pe?{query_str}"
+ result = requests.get(url, headers=headers, timeout=10)
+ assert isinstance(result, requests.Response)
+ assert result.status_code == 200
diff --git a/openbb_platform/extensions/equity/integration/test_equity_python.py b/openbb_platform/extensions/equity/integration/test_equity_python.py
index 67ce1c92fca8..f13df3df5585 100644
--- a/openbb_platform/extensions/equity/integration/test_equity_python.py
+++ b/openbb_platform/extensions/equity/integration/test_equity_python.py
@@ -1819,3 +1819,31 @@ def test_equity_ownership_form_13f(params, obb):
assert result
assert isinstance(result, OBBject)
assert len(result.results) > 0
+
+
+@parametrize(
+ "params",
+ [
+ (
+ {
+ "symbol": "NVDA,MSFT",
+ "provider": "intrinio",
+ }
+ ),
+ (
+ {
+ "symbol": None,
+ "provider": "intrinio",
+ }
+ ),
+ ],
+)
+@pytest.mark.integration
+def test_equity_estimates_forward_pe(params, obb):
+ """Test the equity estimates forward_pe endpoint."""
+ params = {p: v for p, v in params.items() if v}
+
+ result = obb.equity.estimates.forward_pe(**params)
+ assert result
+ assert isinstance(result, OBBject)
+ assert len(result.results) > 0
diff --git a/openbb_platform/extensions/equity/openbb_equity/estimates/estimates_router.py b/openbb_platform/extensions/equity/openbb_equity/estimates/estimates_router.py
index d321c3a9d316..36aae0761b81 100644
--- a/openbb_platform/extensions/equity/openbb_equity/estimates/estimates_router.py
+++ b/openbb_platform/extensions/equity/openbb_equity/estimates/estimates_router.py
@@ -137,3 +137,25 @@ async def forward_eps(
) -> OBBject:
"""Get forward EPS estimates."""
return await OBBject.from_query(Query(**locals()))
+
+
+@router.command(
+ model="ForwardPeEstimates",
+ examples=[
+ APIEx(parameters={"provider": "intrinio"}),
+ APIEx(
+ parameters={
+ "symbol": "AAPL,MSFT,GOOG",
+ "provider": "intrinio",
+ }
+ ),
+ ],
+)
+async def forward_pe(
+ cc: CommandContext,
+ provider_choices: ProviderChoices,
+ standard_params: StandardParams,
+ extra_params: ExtraParams,
+) -> OBBject:
+ """Get forward PE estimates."""
+ return await OBBject.from_query(Query(**locals()))
diff --git a/openbb_platform/openbb/assets/reference.json b/openbb_platform/openbb/assets/reference.json
index febb1baad07d..91095c1bd2ab 100644
--- a/openbb_platform/openbb/assets/reference.json
+++ b/openbb_platform/openbb/assets/reference.json
@@ -6750,6 +6750,139 @@
},
"model": "ForwardEpsEstimates"
},
+ "/equity/estimates/forward_pe": {
+ "deprecated": {
+ "flag": null,
+ "message": null
+ },
+ "description": "Get forward PE estimates.",
+ "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.estimates.forward_pe(provider='intrinio')\nobb.equity.estimates.forward_pe(symbol='AAPL,MSFT,GOOG', provider='intrinio')\n```\n\n",
+ "parameters": {
+ "standard": [
+ {
+ "name": "symbol",
+ "type": "Union[str, List[str]]",
+ "description": "Symbol to get data for. Multiple items allowed for provider(s): intrinio.",
+ "default": null,
+ "optional": true
+ },
+ {
+ "name": "provider",
+ "type": "Literal['intrinio']",
+ "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'intrinio' if there is no default.",
+ "default": "intrinio",
+ "optional": true
+ }
+ ],
+ "intrinio": []
+ },
+ "returns": {
+ "OBBject": [
+ {
+ "name": "results",
+ "type": "List[ForwardPeEstimates]",
+ "description": "Serializable results."
+ },
+ {
+ "name": "provider",
+ "type": "Optional[Literal['intrinio']]",
+ "description": "Provider name."
+ },
+ {
+ "name": "warnings",
+ "type": "Optional[List[Warning_]]",
+ "description": "List of warnings."
+ },
+ {
+ "name": "chart",
+ "type": "Optional[Chart]",
+ "description": "Chart object."
+ },
+ {
+ "name": "extra",
+ "type": "Dict[str, Any]",
+ "description": "Extra info."
+ }
+ ]
+ },
+ "data": {
+ "standard": [
+ {
+ "name": "symbol",
+ "type": "str",
+ "description": "Symbol representing the entity requested in the data.",
+ "default": "",
+ "optional": false
+ },
+ {
+ "name": "name",
+ "type": "str",
+ "description": "Name of the entity.",
+ "default": null,
+ "optional": true
+ },
+ {
+ "name": "year1",
+ "type": "float",
+ "description": "Estimated PE ratio for the next fiscal year.",
+ "default": null,
+ "optional": true
+ },
+ {
+ "name": "year2",
+ "type": "float",
+ "description": "Estimated PE ratio two fiscal years from now.",
+ "default": null,
+ "optional": true
+ },
+ {
+ "name": "year3",
+ "type": "float",
+ "description": "Estimated PE ratio three fiscal years from now.",
+ "default": null,
+ "optional": true
+ },
+ {
+ "name": "year4",
+ "type": "float",
+ "description": "Estimated PE ratio four fiscal years from now.",
+ "default": null,
+ "optional": true
+ },
+ {
+ "name": "year5",
+ "type": "float",
+ "description": "Estimated PE ratio five fiscal years from now.",
+ "default": null,
+ "optional": true
+ }
+ ],
+ "intrinio": [
+ {
+ "name": "peg_ratio_year1",
+ "type": "float",
+ "description": "Estimated Forward PEG ratio for the next fiscal year.",
+ "default": null,
+ "optional": true
+ },
+ {
+ "name": "eps_ttm",
+ "type": "float",
+ "description": "The latest trailing twelve months earnings per share.",
+ "default": null,
+ "optional": true
+ },
+ {
+ "name": "last_udpated",
+ "type": "date",
+ "description": "The date the data was last updated.",
+ "default": null,
+ "optional": true
+ }
+ ]
+ },
+ "model": "ForwardPeEstimates"
+ },
"/equity/discovery/gainers": {
"deprecated": {
"flag": null,
diff --git a/openbb_platform/openbb/package/equity_estimates.py b/openbb_platform/openbb/package/equity_estimates.py
index 01b95add7a5d..efa40206a14c 100644
--- a/openbb_platform/openbb/package/equity_estimates.py
+++ b/openbb_platform/openbb/package/equity_estimates.py
@@ -15,6 +15,7 @@ class ROUTER_equity_estimates(Container):
analyst_search
consensus
forward_eps
+ forward_pe
forward_sales
historical
price_target
@@ -468,6 +469,97 @@ def forward_eps(
)
)
+ @exception_handler
+ @validate
+ def forward_pe(
+ self,
+ symbol: Annotated[
+ Union[str, None, List[Optional[str]]],
+ OpenBBField(
+ description="Symbol to get data for. Multiple comma separated items allowed for provider(s): intrinio."
+ ),
+ ] = None,
+ provider: Annotated[
+ Optional[Literal["intrinio"]],
+ OpenBBField(
+ description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'intrinio' if there is\n no default."
+ ),
+ ] = None,
+ **kwargs
+ ) -> OBBject:
+ """Get forward PE estimates.
+
+ Parameters
+ ----------
+ symbol : Union[str, None, List[Optional[str]]]
+ Symbol to get data for. Multiple comma separated items allowed for provider(s): intrinio.
+ provider : Optional[Literal['intrinio']]
+ The provider to use for the query, by default None.
+ If None, the provider specified in defaults is selected or 'intrinio' if there is
+ no default.
+
+ Returns
+ -------
+ OBBject
+ results : List[ForwardPeEstimates]
+ Serializable results.
+ provider : Optional[Literal['intrinio']]
+ Provider name.
+ warnings : Optional[List[Warning_]]
+ List of warnings.
+ chart : Optional[Chart]
+ Chart object.
+ extra : Dict[str, Any]
+ Extra info.
+
+ ForwardPeEstimates
+ ------------------
+ symbol : str
+ Symbol representing the entity requested in the data.
+ name : Optional[str]
+ Name of the entity.
+ year1 : Optional[float]
+ Estimated PE ratio for the next fiscal year.
+ year2 : Optional[float]
+ Estimated PE ratio two fiscal years from now.
+ year3 : Optional[float]
+ Estimated PE ratio three fiscal years from now.
+ year4 : Optional[float]
+ Estimated PE ratio four fiscal years from now.
+ year5 : Optional[float]
+ Estimated PE ratio five fiscal years from now.
+ peg_ratio_year1 : Optional[float]
+ Estimated Forward PEG ratio for the next fiscal year. (provider: intrinio)
+ eps_ttm : Optional[float]
+ The latest trailing twelve months earnings per share. (provider: intrinio)
+ last_udpated : Optional[date]
+ The date the data was last updated. (provider: intrinio)
+
+ Examples
+ --------
+ >>> from openbb import obb
+ >>> obb.equity.estimates.forward_pe(provider='intrinio')
+ >>> obb.equity.estimates.forward_pe(symbol='AAPL,MSFT,GOOG', provider='intrinio')
+ """ # noqa: E501
+
+ return self._run(
+ "/equity/estimates/forward_pe",
+ **filter_inputs(
+ provider_choices={
+ "provider": self._get_provider(
+ provider,
+ "/equity/estimates/forward_pe",
+ ("intrinio",),
+ )
+ },
+ standard_params={
+ "symbol": symbol,
+ },
+ extra_params=kwargs,
+ info={"symbol": {"intrinio": {"multiple_items_allowed": True}}},
+ )
+ )
+
@exception_handler
@validate
def forward_sales(
diff --git a/openbb_platform/providers/intrinio/openbb_intrinio/__init__.py b/openbb_platform/providers/intrinio/openbb_intrinio/__init__.py
index ae473c72e5c3..370069557f00 100644
--- a/openbb_platform/providers/intrinio/openbb_intrinio/__init__.py
+++ b/openbb_platform/providers/intrinio/openbb_intrinio/__init__.py
@@ -21,6 +21,9 @@
from openbb_intrinio.models.forward_eps_estimates import (
IntrinioForwardEpsEstimatesFetcher,
)
+from openbb_intrinio.models.forward_pe_estimates import (
+ IntrinioForwardPeEstimatesFetcher,
+)
from openbb_intrinio.models.forward_sales_estimates import (
IntrinioForwardSalesEstimatesFetcher,
)
@@ -77,6 +80,7 @@
"EtfSearch": IntrinioEtfSearchFetcher,
"FinancialRatios": IntrinioFinancialRatiosFetcher,
"ForwardEpsEstimates": IntrinioForwardEpsEstimatesFetcher,
+ "ForwardPeEstimates": IntrinioForwardPeEstimatesFetcher,
"ForwardSalesEstimates": IntrinioForwardSalesEstimatesFetcher,
"FredSeries": IntrinioFredSeriesFetcher,
"HistoricalAttributes": IntrinioHistoricalAttributesFetcher,
diff --git a/openbb_platform/providers/intrinio/openbb_intrinio/models/forward_pe_estimates.py b/openbb_platform/providers/intrinio/openbb_intrinio/models/forward_pe_estimates.py
new file mode 100644
index 000000000000..552db46a76ff
--- /dev/null
+++ b/openbb_platform/providers/intrinio/openbb_intrinio/models/forward_pe_estimates.py
@@ -0,0 +1,141 @@
+"""Intrinio Forward PE Estimates Model."""
+
+# pylint: disable=unused-argument
+
+import asyncio
+from datetime import date as dateType
+from typing import Any, Dict, List, Optional
+from warnings import warn
+
+from openbb_core.provider.abstract.fetcher import Fetcher
+from openbb_core.provider.standard_models.forward_pe_estimates import (
+ ForwardPeEstimatesData,
+ ForwardPeEstimatesQueryParams,
+)
+from openbb_core.provider.utils.errors import EmptyDataError
+from openbb_core.provider.utils.helpers import amake_request
+from openbb_intrinio.utils.helpers import response_callback
+from pydantic import Field
+
+
+class IntrinioForwardPeEstimatesQueryParams(ForwardPeEstimatesQueryParams):
+ """Intrinio Forward PE Estimates Query.
+
+ https://api-v2.intrinio.com/zacks/forward_pe?
+ """
+
+ __json_schema_extra__ = {"symbol": {"multiple_items_allowed": True}}
+
+
+class IntrinioForwardPeEstimatesData(ForwardPeEstimatesData):
+ """Intrinio Forward PE Estimates Data."""
+
+ __alias_dict__ = {
+ "symbol": "ticker",
+ "name": "company_name",
+ "year1": "forward_pe_year1",
+ "year2": "forward_pe_year2",
+ "year3": "forward_pe_year3",
+ "year4": "forward_pe_year4",
+ "year5": "forward_pe_year5",
+ "peg_ratio_year1": "forward_peg_ratio_year1",
+ "eps_ttm": "latest_ttm_eps",
+ "last_udpated": "updated_date",
+ }
+
+ peg_ratio_year1: Optional[float] = Field(
+ default=None,
+ description="Estimated Forward PEG ratio for the next fiscal year.",
+ )
+ eps_ttm: Optional[float] = Field(
+ default=None,
+ description="The latest trailing twelve months earnings per share.",
+ )
+ last_udpated: Optional[dateType] = Field(
+ default=None,
+ description="The date the data was last updated.",
+ )
+
+
+class IntrinioForwardPeEstimatesFetcher(
+ Fetcher[IntrinioForwardPeEstimatesQueryParams, List[IntrinioForwardPeEstimatesData]]
+):
+ """Intrinio Forward PE Estimates Fetcher."""
+
+ @staticmethod
+ def transform_query(
+ params: Dict[str, Any]
+ ) -> IntrinioForwardPeEstimatesQueryParams:
+ """Transform the query params."""
+ return IntrinioForwardPeEstimatesQueryParams(**params)
+
+ @staticmethod
+ async def aextract_data(
+ query: IntrinioForwardPeEstimatesQueryParams,
+ credentials: Optional[Dict[str, str]],
+ **kwargs: Any,
+ ) -> List[Dict]:
+ """Return the raw data from the Intrinio endpoint."""
+ api_key = credentials.get("intrinio_api_key") if credentials else ""
+ BASE_URL = "https://api-v2.intrinio.com/zacks/forward_pe"
+ symbols = query.symbol.split(",") if query.symbol else None
+ results: List[Dict] = []
+
+ async def get_one(symbol):
+ """Get the data for one symbol."""
+ url = f"{BASE_URL}/{symbol}?api_key={api_key}"
+ try:
+ data = await amake_request(
+ url, response_callback=response_callback, **kwargs
+ )
+ except Exception as e:
+ warn(f"Symbol Error: {symbol} --> {e}")
+ else:
+ if data:
+ results.append(data) # type: ignore
+
+ if symbols:
+ await asyncio.gather(*[get_one(symbol) for symbol in symbols])
+ if not results:
+ raise EmptyDataError(
+ f"There were no results found for any of the given symbols. -> {symbols}"
+ )
+ return results
+
+ async def fetch_callback(response, session):
+ """Use callback for pagination."""
+ data = await response.json()
+ error = data.get("error", None)
+ if error:
+ message = data.get("message", None)
+ raise RuntimeError(f"Error: {error} -> {message}")
+ forward_pe = data.get("forward_pe")
+ if forward_pe and len(forward_pe) > 0: # type: ignore
+ results.extend(forward_pe) # type: ignore
+ return results
+
+ url = f"{BASE_URL}?page_size=10000&api_key={api_key}"
+ results = await amake_request(url, response_callback=fetch_callback, **kwargs) # type: ignore
+
+ if not results:
+ raise EmptyDataError("The request was successful but was returned empty.")
+
+ return results
+
+ @staticmethod
+ def transform_data(
+ query: IntrinioForwardPeEstimatesQueryParams,
+ data: List[Dict],
+ **kwargs: Any,
+ ) -> List[IntrinioForwardPeEstimatesData]:
+ """Transform the raw data into the standard format."""
+ symbols = query.symbol.split(",") if query.symbol else []
+ if symbols:
+ data.sort(
+ key=lambda item: (
+ symbols.index(item.get("ticker")) # type: ignore
+ if item.get("ticker") in symbols
+ else len(symbols)
+ )
+ )
+ return [IntrinioForwardPeEstimatesData.model_validate(d) for d in data]
diff --git a/openbb_platform/providers/intrinio/tests/record/http/test_intrinio_fetchers/test_intrinio_forward_pe_fetcher.yaml b/openbb_platform/providers/intrinio/tests/record/http/test_intrinio_fetchers/test_intrinio_forward_pe_fetcher.yaml
new file mode 100644
index 000000000000..dd99f2c9269a
--- /dev/null
+++ b/openbb_platform/providers/intrinio/tests/record/http/test_intrinio_fetchers/test_intrinio_forward_pe_fetcher.yaml
@@ -0,0 +1,70 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/json
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ method: GET
+ uri: https://api-v2.intrinio.com/zacks/forward_pe/MSFT?api_key=MOCK_API_KEY
+ response:
+ body:
+ string: !!binary |
+ H4sIAGSBQWYAA2TOMQuDMBAF4L9Sbq5HcpoWswpCh2JR9xA0LdKqIaYUKf3vjUOHkuWG93GP9wY/
+ dHfjQMK5KVvYQzePVk+rmvRotvRU1FVTle2uqOpL8KfttTe92m5wYpQlTCScBbvO7qVdr6xRq9GO
+ g0wF0iECCsAxExGkIOmILMqzkBPGRQIkz5H9Fd2U036YfwsIeb6HR1i7eOX9qIxdwhdHIT5fAAAA
+ //8DADhyNhP+AAAA
+ headers:
+ Connection:
+ - keep-alive
+ Content-Encoding:
+ - gzip
+ Content-Type:
+ - application/json
+ Date:
+ - Mon, 13 May 2024 02:56:36 GMT
+ Transfer-Encoding:
+ - chunked
+ Vary:
+ - Origin,Accept-Encoding
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/json
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ method: GET
+ uri: https://api-v2.intrinio.com/zacks/forward_pe/AAPL?api_key=MOCK_API_KEY
+ response:
+ body:
+ string: !!binary |
+ H4sIAGSBQWYAA2zOywrCMBQE0F+Ru25DkiY+siviQiiSP7iEJkqxj5CmSBH/3dSFCHUzizkMzBNi
+ U99dAAVlqSvIoB46b/oZe9O5pdW6Om3Ol2OiyVsTncUlE3HKRU5lzmiy6xAeJlj0DmdnAgPFd2Qv
+ V8ATSCLYCooE/N9CfOAgViBB9VPb/vY3DCY2w/cC4Rm06e0YMcYOnR9BbYkoXm8AAAD//wMALdic
+ IvgAAAA=
+ headers:
+ Connection:
+ - keep-alive
+ Content-Encoding:
+ - gzip
+ Content-Type:
+ - application/json
+ Date:
+ - Mon, 13 May 2024 02:56:36 GMT
+ Transfer-Encoding:
+ - chunked
+ Vary:
+ - Origin,Accept-Encoding
+ status:
+ code: 200
+ message: OK
+version: 1
diff --git a/openbb_platform/providers/intrinio/tests/test_intrinio_fetchers.py b/openbb_platform/providers/intrinio/tests/test_intrinio_fetchers.py
index b319d94ca37d..8c2217c92c73 100644
--- a/openbb_platform/providers/intrinio/tests/test_intrinio_fetchers.py
+++ b/openbb_platform/providers/intrinio/tests/test_intrinio_fetchers.py
@@ -25,6 +25,9 @@
from openbb_intrinio.models.forward_eps_estimates import (
IntrinioForwardEpsEstimatesFetcher,
)
+from openbb_intrinio.models.forward_pe_estimates import (
+ IntrinioForwardPeEstimatesFetcher,
+)
from openbb_intrinio.models.forward_sales_estimates import (
IntrinioForwardSalesEstimatesFetcher,
)
@@ -505,3 +508,13 @@ def test_intrinio_price_target_consensus_fetcher(credentials=test_credentials):
fetcher = IntrinioPriceTargetConsensusFetcher()
result = fetcher.test(params, credentials)
assert result is None
+
+
+@pytest.mark.record_http
+def test_intrinio_forward_pe_fetcher(credentials=test_credentials):
+ """Test forward pe fetcher."""
+ params = {"symbol": "AAPL,MSFT"}
+
+ fetcher = IntrinioForwardPeEstimatesFetcher()
+ result = fetcher.test(params, credentials)
+ assert result is None
From 88cdd75a6d14f3f0143c5b8dcc94417c0968b02d Mon Sep 17 00:00:00 2001
From: Henrique Joaquim
Date: Tue, 14 May 2024 13:15:33 +0100
Subject: [PATCH 06/13] [Feature] Custom Provider choices available on the
`reference.json` (#6409)
* change package builder and argparse translator to account for custom chocies defined in providers
* default reference
---
.../argparse_translator.py | 14 +-
.../openbb_core/app/static/package_builder.py | 5 +-
openbb_platform/openbb/assets/reference.json | 9410 +++++++++++------
3 files changed, 6375 insertions(+), 3054 deletions(-)
diff --git a/cli/openbb_cli/argparse_translator/argparse_translator.py b/cli/openbb_cli/argparse_translator/argparse_translator.py
index 724c2bea3060..7931b22304f7 100644
--- a/cli/openbb_cli/argparse_translator/argparse_translator.py
+++ b/cli/openbb_cli/argparse_translator/argparse_translator.py
@@ -42,7 +42,7 @@ class CustomArgument(BaseModel):
action: Literal["store_true", "store"]
help: str
nargs: Optional[Literal["+"]]
- choices: Optional[Any]
+ choices: Optional[Tuple]
@model_validator(mode="after") # type: ignore
@classmethod
@@ -117,7 +117,7 @@ def _get_nargs(self, type_: type) -> Optional[Union[int, str]]:
return "+"
return None
- def _get_choices(self, type_: str) -> Tuple:
+ def _get_choices(self, type_: str, custom_choices: Any) -> Tuple:
"""Get the choices for the given type."""
type_ = self._make_type_parsable(type_) # type: ignore
type_origin = get_origin(type_)
@@ -126,14 +126,12 @@ def _get_choices(self, type_: str) -> Tuple:
if type_origin is Literal:
choices = get_args(type_)
- # param_type = type(choices[0])
if type_origin is list:
type_ = get_args(type_)[0]
if get_origin(type_) is Literal:
choices = get_args(type_)
- # param_type = type(choices[0])
if type_origin is Union and type(None) in get_args(type_):
# remove NoneType from the args
@@ -145,7 +143,9 @@ def _get_choices(self, type_: str) -> Tuple:
if get_origin(type_) is Literal:
choices = get_args(type_)
- # param_type = type(choices[0])
+
+ if custom_choices:
+ return tuple(custom_choices)
return choices
@@ -174,7 +174,9 @@ def build_custom_groups(self):
action="store" if type_ != bool else "store_true",
help=arg["description"],
nargs=self._get_nargs(type_), # type: ignore
- choices=self._get_choices(arg["type"]),
+ choices=self._get_choices(
+ arg["type"], custom_choices=arg["choices"]
+ ),
)
)
diff --git a/openbb_platform/core/openbb_core/app/static/package_builder.py b/openbb_platform/core/openbb_core/app/static/package_builder.py
index 11fcc5766b0a..feb3803f6ed9 100644
--- a/openbb_platform/core/openbb_core/app/static/package_builder.py
+++ b/openbb_platform/core/openbb_core/app/static/package_builder.py
@@ -1483,8 +1483,10 @@ def _get_provider_field_params(
.strip().replace("\n", " ").replace(" ", " ").replace('"', "'")
) # fmt: skip
+ extra = field_info.json_schema_extra or {}
+
# Add information for the providers supporting multiple symbols
- if params_type == "QueryParams" and (extra := field_info.json_schema_extra):
+ if params_type == "QueryParams" and extra:
providers = []
for p, v in extra.items(): # type: ignore[union-attr]
@@ -1512,6 +1514,7 @@ def _get_provider_field_params(
"description": cleaned_description,
"default": default_value,
"optional": not is_required,
+ "choices": extra.get("choices"),
}
)
diff --git a/openbb_platform/openbb/assets/reference.json b/openbb_platform/openbb/assets/reference.json
index 91095c1bd2ab..f184e92a4c47 100644
--- a/openbb_platform/openbb/assets/reference.json
+++ b/openbb_platform/openbb/assets/reference.json
@@ -50,21 +50,24 @@
"type": "Union[str, List[str]]",
"description": "Symbol to get data for. Can use CURR1-CURR2 or CURR1CURR2 format. Multiple items allowed for provider(s): fmp, polygon, tiingo, yfinance.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "start_date",
"type": "Union[date, str]",
"description": "Start date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "end_date",
"type": "Union[date, str]",
"description": "End date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -80,7 +83,8 @@
"type": "Literal['1m', '5m', '15m', '30m', '1h', '4h', '1d']",
"description": "Time interval of the data to return.",
"default": "1d",
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"polygon": [
@@ -89,21 +93,24 @@
"type": "str",
"description": "Time interval of the data to return. The numeric portion of the interval can be any positive integer. The letter portion can be one of the following: s, m, h, d, W, M, Q, Y",
"default": "1d",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "sort",
"type": "Literal['asc', 'desc']",
"description": "Sort order of the data. This impacts the results in combination with the 'limit' parameter. The results are always returned in ascending order by date.",
"default": "asc",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "limit",
"type": "int",
"description": "The number of data entries to return.",
"default": 49999,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"tiingo": [
@@ -112,14 +119,16 @@
"type": "Literal['1m', '5m', '15m', '30m', '1h', '4h', '1d']",
"description": "Time interval of the data to return.",
"default": "1d",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "exchanges",
"type": "List[str]",
"description": "To limit the query to a subset of exchanges e.g. ['POLONIEX', 'GDAX']",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"yfinance": [
@@ -128,7 +137,8 @@
"type": "Literal['1m', '2m', '5m', '15m', '30m', '60m', '90m', '1h', '1d', '5d', '1W', '1M', '1Q']",
"description": "Time interval of the data to return.",
"default": "1d",
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -168,49 +178,56 @@
"type": "Union[date, datetime]",
"description": "The date of the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "open",
"type": "float",
"description": "The open price.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "high",
"type": "float",
"description": "The high price.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "low",
"type": "float",
"description": "The low price.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "close",
"type": "float",
"description": "The close price.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "volume",
"type": "float",
"description": "The trading volume.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "vwap",
"type": "Annotated[float, Gt(gt=0)]",
"description": "Volume Weighted Average Price over the period.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"fmp": [
@@ -219,21 +236,24 @@
"type": "float",
"description": "The adjusted close price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "change",
"type": "float",
"description": "Change in the price from the previous close.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "change_percent",
"type": "float",
"description": "Change in the price from the previous close, as a normalized percent.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"polygon": [
@@ -242,7 +262,8 @@
"type": "Annotated[int, Gt(gt=0)]",
"description": "Number of transactions for the symbol in the time period.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"tiingo": [
@@ -251,14 +272,16 @@
"type": "int",
"description": "Number of transactions for the symbol in the time period.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "volume_notional",
"type": "float",
"description": "The last size done for the asset on the specific date in the quote currency. The volume of the asset on the specific date in the quote currency.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"yfinance": []
@@ -279,7 +302,8 @@
"type": "str",
"description": "Search query.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -327,14 +351,16 @@
"type": "str",
"description": "Symbol representing the entity requested in the data. (Crypto)",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "name",
"type": "str",
"description": "Name of the crypto.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"fmp": [
@@ -343,21 +369,24 @@
"type": "str",
"description": "The currency the crypto trades for.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "exchange",
"type": "str",
"description": "The exchange code the crypto trades on.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "exchange_name",
"type": "str",
"description": "The short name of the exchange the crypto trades on.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -377,21 +406,24 @@
"type": "Union[str, List[str]]",
"description": "Symbol to get data for. Can use CURR1-CURR2 or CURR1CURR2 format. Multiple items allowed for provider(s): fmp, polygon, tiingo, yfinance.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "start_date",
"type": "Union[date, str]",
"description": "Start date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "end_date",
"type": "Union[date, str]",
"description": "End date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -407,7 +439,8 @@
"type": "Literal['1m', '5m', '15m', '30m', '1h', '4h', '1d']",
"description": "Time interval of the data to return.",
"default": "1d",
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"polygon": [
@@ -416,21 +449,24 @@
"type": "str",
"description": "Time interval of the data to return. The numeric portion of the interval can be any positive integer. The letter portion can be one of the following: s, m, h, d, W, M, Q, Y",
"default": "1d",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "sort",
"type": "Literal['asc', 'desc']",
"description": "Sort order of the data. This impacts the results in combination with the 'limit' parameter. The results are always returned in ascending order by date.",
"default": "asc",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "limit",
"type": "int",
"description": "The number of data entries to return.",
"default": 49999,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"tiingo": [
@@ -439,7 +475,8 @@
"type": "Literal['1m', '5m', '15m', '30m', '1h', '4h', '1d']",
"description": "Time interval of the data to return.",
"default": "1d",
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"yfinance": [
@@ -448,7 +485,8 @@
"type": "Literal['1m', '2m', '5m', '15m', '30m', '60m', '90m', '1h', '1d', '5d', '1W', '1M', '1Q']",
"description": "Time interval of the data to return.",
"default": "1d",
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -488,49 +526,56 @@
"type": "Union[date, datetime]",
"description": "The date of the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "open",
"type": "float",
"description": "The open price.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "high",
"type": "float",
"description": "The high price.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "low",
"type": "float",
"description": "The low price.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "close",
"type": "float",
"description": "The close price.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "volume",
"type": "float",
"description": "The trading volume.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "vwap",
"type": "Annotated[float, Gt(gt=0)]",
"description": "Volume Weighted Average Price over the period.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"fmp": [
@@ -539,21 +584,24 @@
"type": "float",
"description": "The adjusted close price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "change",
"type": "float",
"description": "Change in the price from the previous close.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "change_percent",
"type": "float",
"description": "Change in the price from the previous close, as a normalized percent.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"polygon": [
@@ -562,7 +610,8 @@
"type": "Annotated[int, Gt(gt=0)]",
"description": "Number of transactions for the symbol in the time period.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"tiingo": [],
@@ -584,7 +633,8 @@
"type": "str",
"description": "Query to search for currency pairs.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -634,14 +684,16 @@
"type": "str",
"description": "Symbol representing the entity requested in the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "name",
"type": "str",
"description": "Name of the currency pair.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"fmp": [
@@ -650,28 +702,32 @@
"type": "str",
"description": "Symbol of the currency pair.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "currency",
"type": "str",
"description": "Base currency of the currency pair.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "stock_exchange",
"type": "str",
"description": "Stock exchange of the currency pair.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "exchange_short_name",
"type": "str",
"description": "Short name of the stock exchange of the currency pair.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"intrinio": [
@@ -680,14 +736,16 @@
"type": "str",
"description": "ISO 4217 currency code of the base currency.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "quote_currency",
"type": "str",
"description": "ISO 4217 currency code of the quote currency.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
],
"polygon": [
@@ -696,49 +754,56 @@
"type": "str",
"description": "The symbol of the quote currency.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "base_currency_symbol",
"type": "str",
"description": "The symbol of the base currency.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "base_currency_name",
"type": "str",
"description": "Name of the base currency.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "market",
"type": "str",
"description": "Name of the trading market. Always 'fx'.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "locale",
"type": "str",
"description": "Locale of the currency pair.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "last_updated",
"type": "date",
"description": "The date the reference data was last updated.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "delisted",
"type": "date",
"description": "The date the item was delisted.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -758,21 +823,24 @@
"type": "Union[str, List[str]]",
"description": "The base currency symbol. Multiple items allowed for provider(s): fmp, polygon.",
"default": "usd",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "quote_type",
"type": "Literal['direct', 'indirect']",
"description": "Whether the quote is direct or indirect. Selecting 'direct' will return the exchange rate as the amount of domestic currency required to buy one unit of the foreign currency. Selecting 'indirect' (default) will return the exchange rate as the amount of foreign currency required to buy one unit of the domestic currency.",
"default": "indirect",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "counter_currencies",
"type": "Union[List[str], str]",
"description": "An optional list of counter currency symbols to filter for. None returns all.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -821,63 +889,72 @@
"type": "str",
"description": "The base, or domestic, currency.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "counter_currency",
"type": "str",
"description": "The counter, or foreign, currency.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "last_rate",
"type": "float",
"description": "The exchange rate, relative to the base currency. Rates are expressed as the amount of foreign currency received from selling one unit of the base currency, or the quantity of foreign currency required to purchase one unit of the domestic currency. To inverse the perspective, set the 'quote_type' parameter as 'direct'.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "open",
"type": "float",
"description": "The open price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "high",
"type": "float",
"description": "The high price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "low",
"type": "float",
"description": "The low price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "close",
"type": "float",
"description": "The close price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "volume",
"type": "int",
"description": "The trading volume.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "prev_close",
"type": "float",
"description": "The previous close price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"fmp": [
@@ -886,49 +963,56 @@
"type": "float",
"description": "The change in the price from the previous close.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "change_percent",
"type": "float",
"description": "The change in the price from the previous close, as a normalized percent.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "ma50",
"type": "float",
"description": "The 50-day moving average.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "ma200",
"type": "float",
"description": "The 200-day moving average.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "year_high",
"type": "float",
"description": "The 52-week high.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "year_low",
"type": "float",
"description": "The 52-week low.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "last_rate_timestamp",
"type": "datetime",
"description": "The timestamp of the last rate.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"polygon": [
@@ -937,140 +1021,160 @@
"type": "float",
"description": "The volume-weighted average price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "change",
"type": "float",
"description": "The change in price from the previous day.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "change_percent",
"type": "float",
"description": "The percentage change in price from the previous day.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "prev_open",
"type": "float",
"description": "The previous day's opening price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "prev_high",
"type": "float",
"description": "The previous day's high price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "prev_low",
"type": "float",
"description": "The previous day's low price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "prev_volume",
"type": "float",
"description": "The previous day's volume.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "prev_vwap",
"type": "float",
"description": "The previous day's VWAP.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "bid",
"type": "float",
"description": "The current bid price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "ask",
"type": "float",
"description": "The current ask price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "minute_open",
"type": "float",
"description": "The open price from the most recent minute bar.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "minute_high",
"type": "float",
"description": "The high price from the most recent minute bar.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "minute_low",
"type": "float",
"description": "The low price from the most recent minute bar.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "minute_close",
"type": "float",
"description": "The close price from the most recent minute bar.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "minute_volume",
"type": "float",
"description": "The volume from the most recent minute bar.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "minute_vwap",
"type": "float",
"description": "The VWAP from the most recent minute bar.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "minute_transactions",
"type": "float",
"description": "The number of transactions in the most recent minute bar.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "quote_timestamp",
"type": "datetime",
"description": "The timestamp of the last quote.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "minute_timestamp",
"type": "datetime",
"description": "The timestamp for the start of the most recent minute bar.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "last_updated",
"type": "datetime",
"description": "The last time the data was updated.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
]
},
@@ -1090,7 +1194,8 @@
"type": "str",
"description": "Symbol to get data for.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "provider",
@@ -1106,7 +1211,8 @@
"type": "Union[date, str]",
"description": "The end-of-day date for options chains data.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -1146,301 +1252,344 @@
"type": "str",
"description": "Symbol representing the entity requested in the data. Here, it is the underlying symbol for the option.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "contract_symbol",
"type": "str",
"description": "Contract symbol for the option.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "eod_date",
"type": "date",
"description": "Date for which the options chains are returned.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "expiration",
"type": "date",
"description": "Expiration date of the contract.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "strike",
"type": "float",
"description": "Strike price of the contract.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "option_type",
"type": "str",
"description": "Call or Put.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "open_interest",
"type": "int",
"description": "Open interest on the contract.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "volume",
"type": "int",
"description": "The trading volume.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "theoretical_price",
"type": "float",
"description": "Theoretical value of the option.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "last_trade_price",
"type": "float",
"description": "Last trade price of the option.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "tick",
"type": "str",
"description": "Whether the last tick was up or down in price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "bid",
"type": "float",
"description": "Current bid price for the option.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "bid_size",
"type": "int",
"description": "Bid size for the option.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "ask",
"type": "float",
"description": "Current ask price for the option.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "ask_size",
"type": "int",
"description": "Ask size for the option.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "mark",
"type": "float",
"description": "The mid-price between the latest bid and ask.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "open",
"type": "float",
"description": "The open price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "open_bid",
"type": "float",
"description": "The opening bid price for the option that day.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "open_ask",
"type": "float",
"description": "The opening ask price for the option that day.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "high",
"type": "float",
"description": "The high price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "bid_high",
"type": "float",
"description": "The highest bid price for the option that day.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "ask_high",
"type": "float",
"description": "The highest ask price for the option that day.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "low",
"type": "float",
"description": "The low price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "bid_low",
"type": "float",
"description": "The lowest bid price for the option that day.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "ask_low",
"type": "float",
"description": "The lowest ask price for the option that day.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "close",
"type": "float",
"description": "The close price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "close_size",
"type": "int",
"description": "The closing trade size for the option that day.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "close_time",
"type": "datetime",
"description": "The time of the closing price for the option that day.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "close_bid",
"type": "float",
"description": "The closing bid price for the option that day.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "close_bid_size",
"type": "int",
"description": "The closing bid size for the option that day.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "close_bid_time",
"type": "datetime",
"description": "The time of the bid closing price for the option that day.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "close_ask",
"type": "float",
"description": "The closing ask price for the option that day.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "close_ask_size",
"type": "int",
"description": "The closing ask size for the option that day.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "close_ask_time",
"type": "datetime",
"description": "The time of the ask closing price for the option that day.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "prev_close",
"type": "float",
"description": "The previous close price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "change",
"type": "float",
"description": "The change in the price of the option.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "change_percent",
"type": "float",
"description": "Change, in normalizezd percentage points, of the option.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "implied_volatility",
"type": "float",
"description": "Implied volatility of the option.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "delta",
"type": "float",
"description": "Delta of the option.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "gamma",
"type": "float",
"description": "Gamma of the option.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "theta",
"type": "float",
"description": "Theta of the option.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "vega",
"type": "float",
"description": "Vega of the option.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "rho",
"type": "float",
"description": "Rho of the option.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"intrinio": [
@@ -1449,7 +1598,8 @@
"type": "str",
"description": "The exercise style of the option, American or European.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -1469,7 +1619,8 @@
"type": "str",
"description": "Symbol to get data for. (the underlying symbol)",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -1485,56 +1636,64 @@
"type": "Union[date, str]",
"description": "Start date of the data, in YYYY-MM-DD format. If no symbol is supplied, requests are only allowed for a single date. Use the start_date for the target date. Intrinio appears to have data beginning Feb/2022, but is unclear when it actually began.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "end_date",
"type": "Union[date, str]",
"description": "End date of the data, in YYYY-MM-DD format. If a symbol is not supplied, do not include an end date.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "trade_type",
"type": "Literal['block', 'sweep', 'large']",
"description": "The type of unusual activity to query for.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "sentiment",
"type": "Literal['bullish', 'bearish', 'neutral']",
"description": "The sentiment type to query for.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "min_value",
"type": "Union[int, float]",
"description": "The inclusive minimum total value for the unusual activity.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "max_value",
"type": "Union[int, float]",
"description": "The inclusive maximum total value for the unusual activity.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "limit",
"type": "int",
"description": "The number of data entries to return. A typical day for all symbols will yield 50-80K records. The API will paginate at 1000 records. The high default limit (100K) is to be able to reliably capture the most days. The high absolute limit (1.25M) is to allow for outlier days. Queries at the absolute limit will take a long time, and might be unreliable. Apply filters to improve performance.",
"default": 100000,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "source",
"type": "Literal['delayed', 'realtime']",
"description": "The source of the data. Either realtime or delayed.",
"default": "delayed",
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -1574,14 +1733,16 @@
"type": "str",
"description": "Symbol representing the entity requested in the data. (the underlying symbol)",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "contract_symbol",
"type": "str",
"description": "Contract symbol for the option.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
],
"intrinio": [
@@ -1590,63 +1751,72 @@
"type": "datetime",
"description": "The datetime of order placement.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "trade_type",
"type": "Literal['block', 'sweep', 'large']",
"description": "The type of unusual trade.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "sentiment",
"type": "Literal['bullish', 'bearish', 'neutral']",
"description": "Bullish, Bearish, or Neutral Sentiment is estimated based on whether the trade was executed at the bid, ask, or mark price.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "bid_at_execution",
"type": "float",
"description": "Bid price at execution.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "ask_at_execution",
"type": "float",
"description": "Ask price at execution.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "average_price",
"type": "float",
"description": "The average premium paid per option contract.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "underlying_price_at_execution",
"type": "float",
"description": "Price of the underlying security at execution of trade.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "total_size",
"type": "int",
"description": "The total number of contracts involved in a single transaction.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "total_value",
"type": "Union[int, float]",
"description": "The aggregated value of all option contract premiums included in the trade.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
]
},
@@ -1666,28 +1836,32 @@
"type": "Union[str, List[str]]",
"description": "Symbol to get data for. Multiple items allowed for provider(s): yfinance.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "start_date",
"type": "Union[date, str]",
"description": "Start date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "end_date",
"type": "Union[date, str]",
"description": "End date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "expiration",
"type": "str",
"description": "Future expiry date with format YYYY-MM",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -1703,7 +1877,8 @@
"type": "Literal['1m', '2m', '5m', '15m', '30m', '60m', '90m', '1h', '1d', '5d', '1W', '1M', '1Q']",
"description": "Time interval of the data to return.",
"default": "1d",
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -1743,42 +1918,48 @@
"type": "datetime",
"description": "The date of the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "open",
"type": "float",
"description": "The open price.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "high",
"type": "float",
"description": "The high price.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "low",
"type": "float",
"description": "The low price.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "close",
"type": "float",
"description": "The close price.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "volume",
"type": "float",
"description": "The trading volume.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
],
"yfinance": []
@@ -1799,14 +1980,16 @@
"type": "str",
"description": "Symbol to get data for.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "date",
"type": "Union[date, str]",
"description": "A specific date to get data for.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -1854,14 +2037,16 @@
"type": "str",
"description": "Futures expiration month.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "price",
"type": "float",
"description": "The close price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"yfinance": []
@@ -1882,28 +2067,32 @@
"type": "Literal['quarter', 'annual']",
"description": "Time period of the data to return. Units for nominal GDP period. Either quarter or annual.",
"default": "annual",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "start_date",
"type": "Union[date, str]",
"description": "Start date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "end_date",
"type": "Union[date, str]",
"description": "End date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "type",
"type": "Literal['nominal', 'real']",
"description": "Type of GDP to get forecast of. Either nominal or real.",
"default": "real",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -1919,7 +2108,8 @@
"type": "Literal['argentina', 'asia', 'australia', 'austria', 'belgium', 'brazil', 'bulgaria', 'canada', 'chile', 'china', 'colombia', 'costa_rica', 'croatia', 'czech_republic', 'denmark', 'estonia', 'euro_area_17', 'finland', 'france', 'germany', 'greece', 'hungary', 'iceland', 'india', 'indonesia', 'ireland', 'israel', 'italy', 'japan', 'korea', 'latvia', 'lithuania', 'luxembourg', 'mexico', 'netherlands', 'new_zealand', 'non-oecd', 'norway', 'oecd_total', 'peru', 'poland', 'portugal', 'romania', 'russia', 'slovak_republic', 'slovenia', 'south_africa', 'spain', 'sweden', 'switzerland', 'turkey', 'united_kingdom', 'united_states', 'world']",
"description": "Country to get GDP for.",
"default": "united_states",
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -1959,14 +2149,16 @@
"type": "date",
"description": "The date of the data.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "value",
"type": "float",
"description": "Nominal GDP value on the date.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"oecd": []
@@ -1987,21 +2179,24 @@
"type": "Literal['usd', 'usd_cap']",
"description": "The unit of measurement for the data. Units to get nominal GDP in. Either usd or usd_cap indicating per capita.",
"default": "usd",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "start_date",
"type": "Union[date, str]",
"description": "Start date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "end_date",
"type": "Union[date, str]",
"description": "End date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -2017,7 +2212,8 @@
"type": "Literal['australia', 'austria', 'belgium', 'brazil', 'canada', 'chile', 'colombia', 'costa_rica', 'czech_republic', 'denmark', 'estonia', 'euro_area', 'european_union', 'finland', 'france', 'germany', 'greece', 'hungary', 'iceland', 'indonesia', 'ireland', 'israel', 'italy', 'japan', 'korea', 'latvia', 'lithuania', 'luxembourg', 'mexico', 'netherlands', 'new_zealand', 'norway', 'poland', 'portugal', 'russia', 'slovak_republic', 'slovenia', 'south_africa', 'spain', 'sweden', 'switzerland', 'turkey', 'united_kingdom', 'united_states', 'all']",
"description": "Country to get GDP for.",
"default": "united_states",
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -2057,14 +2253,16 @@
"type": "date",
"description": "The date of the data.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "value",
"type": "float",
"description": "Nominal GDP value on the date.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"oecd": []
@@ -2085,21 +2283,24 @@
"type": "Literal['idx', 'qoq', 'yoy']",
"description": "The unit of measurement for the data. Either idx (indicating 2015=100), qoq (previous period) or yoy (same period, previous year).)",
"default": "yoy",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "start_date",
"type": "Union[date, str]",
"description": "Start date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "end_date",
"type": "Union[date, str]",
"description": "End date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -2115,7 +2316,8 @@
"type": "Literal['G20', 'G7', 'argentina', 'australia', 'austria', 'belgium', 'brazil', 'bulgaria', 'canada', 'chile', 'china', 'colombia', 'costa_rica', 'croatia', 'czech_republic', 'denmark', 'estonia', 'euro_area_19', 'europe', 'european_union_27', 'finland', 'france', 'germany', 'greece', 'hungary', 'iceland', 'india', 'indonesia', 'ireland', 'israel', 'italy', 'japan', 'korea', 'latvia', 'lithuania', 'luxembourg', 'mexico', 'netherlands', 'new_zealand', 'norway', 'oecd_total', 'poland', 'portugal', 'romania', 'russia', 'saudi_arabia', 'slovak_republic', 'slovenia', 'south_africa', 'spain', 'sweden', 'switzerland', 'turkey', 'united_kingdom', 'united_states', 'all']",
"description": "Country to get GDP for.",
"default": "united_states",
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -2155,14 +2357,16 @@
"type": "date",
"description": "The date of the data.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "value",
"type": "float",
"description": "Nominal GDP value on the date.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"oecd": []
@@ -2183,14 +2387,16 @@
"type": "Union[date, str]",
"description": "Start date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "end_date",
"type": "Union[date, str]",
"description": "End date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -2207,28 +2413,248 @@
"type": "Union[str, List[str]]",
"description": "Country of the event. Multiple items allowed for provider(s): tradingeconomics.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": [
+ "brazil",
+ "isle_of_man",
+ "belgium",
+ "ukraine",
+ "liechtenstein",
+ "malawi",
+ "tunisia",
+ "jamaica",
+ "guinea",
+ "sri_lanka",
+ "united_states",
+ "mauritania",
+ "pakistan",
+ "new_zealand",
+ "mauritius",
+ "namibia",
+ "nepal",
+ "yemen",
+ "bhutan",
+ "benin",
+ "malta",
+ "georgia",
+ "east_timor",
+ "switzerland",
+ "trinidad_and_tobago",
+ "south_sudan",
+ "austria",
+ "cyprus",
+ "suriname",
+ "egypt",
+ "latvia",
+ "luxembourg",
+ "nicaragua",
+ "ghana",
+ "panama",
+ "north_macedonia",
+ "equatorial_guinea",
+ "cambodia",
+ "iraq",
+ "south_africa",
+ "serbia",
+ "zambia",
+ "republic_of_the_congo",
+ "sudan",
+ "guinea_bissau",
+ "sao_tome_and_principe",
+ "seychelles",
+ "singapore",
+ "greece",
+ "slovakia",
+ "maldives",
+ "australia",
+ "togo",
+ "czech_republic",
+ "guatemala",
+ "finland",
+ "mexico",
+ "iran",
+ "taiwan",
+ "north_korea",
+ "ireland",
+ "el_salvador",
+ "brunei",
+ "bahrain",
+ "south_korea",
+ "hong_kong",
+ "liberia",
+ "vanuatu",
+ "slovenia",
+ "qatar",
+ "united_arab_emirates",
+ "antigua_and_barbuda",
+ "estonia",
+ "ecuador",
+ "kenya",
+ "kiribati",
+ "israel",
+ "kosovo",
+ "eritrea",
+ "niger",
+ "sierra_leone",
+ "thailand",
+ "lesotho",
+ "puerto_rico",
+ "croatia",
+ "andorra",
+ "denmark",
+ "congo",
+ "aruba",
+ "tonga",
+ "germany",
+ "france",
+ "norway",
+ "tajikistan",
+ "azerbaijan",
+ "chad",
+ "spain",
+ "madagascar",
+ "palestine",
+ "algeria",
+ "ivory_coast",
+ "somalia",
+ "bermuda",
+ "romania",
+ "belize",
+ "costa_rica",
+ "argentina",
+ "tanzania",
+ "dominican_republic",
+ "uruguay",
+ "belarus",
+ "botswana",
+ "peru",
+ "libya",
+ "bosnia_and_herzegovina",
+ "swaziland",
+ "jordan",
+ "bolivia",
+ "kazakhstan",
+ "macao",
+ "chile",
+ "zimbabwe",
+ "moldova",
+ "burundi",
+ "honduras",
+ "grenada",
+ "gambia",
+ "indonesia",
+ "italy",
+ "burkina_faso",
+ "venezuela",
+ "myanmar",
+ "senegal",
+ "guyana",
+ "turkey",
+ "fiji",
+ "new_caledonia",
+ "netherlands",
+ "montenegro",
+ "angola",
+ "mongolia",
+ "central_african_republic",
+ "china",
+ "gabon",
+ "djibouti",
+ "vietnam",
+ "papua_new_guinea",
+ "saudi_arabia",
+ "mali",
+ "philippines",
+ "turkmenistan",
+ "nigeria",
+ "laos",
+ "euro_area",
+ "bangladesh",
+ "armenia",
+ "morocco",
+ "afghanistan",
+ "monaco",
+ "lithuania",
+ "lebanon",
+ "canada",
+ "russia",
+ "cuba",
+ "samoa",
+ "rwanda",
+ "hungary",
+ "kuwait",
+ "sweden",
+ "mozambique",
+ "albania",
+ "solomon_islands",
+ "cameroon",
+ "malaysia",
+ "haiti",
+ "colombia",
+ "faroe_islands",
+ "iceland",
+ "comoros",
+ "kyrgyzstan",
+ "poland",
+ "bahamas",
+ "ethiopia",
+ "dominica",
+ "uganda",
+ "portugal",
+ "barbados",
+ "oman",
+ "bulgaria",
+ "india",
+ "japan",
+ "cayman_islands",
+ "paraguay",
+ "uzbekistan",
+ "cape_verde",
+ "united_kingdom",
+ "syria"
+ ]
},
{
"name": "importance",
"type": "Literal['low', 'medium', 'high']",
"description": "Importance of the event.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": [
+ "low",
+ "medium",
+ "high"
+ ]
},
{
"name": "group",
"type": "Literal['interest_rate', 'inflation', 'bonds', 'consumer', 'gdp', 'government', 'housing', 'labour', 'markets', 'money', 'prices', 'trade', 'business']",
"description": "Grouping of events.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": [
+ "interest_rate",
+ "inflation",
+ "bonds",
+ "consumer",
+ "gdp",
+ "government",
+ "housing",
+ "labour",
+ "markets",
+ "money",
+ "prices",
+ "trade",
+ "business"
+ ]
},
{
"name": "calendar_id",
"type": "Union[Union[int, str], List[Union[int, str]]]",
"description": "Get events by TradingEconomics Calendar ID. Multiple items allowed for provider(s): tradingeconomics.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -2268,84 +2694,96 @@
"type": "datetime",
"description": "The date of the data.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "country",
"type": "str",
"description": "Country of event.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "category",
"type": "str",
"description": "Category of event.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "event",
"type": "str",
"description": "Event name.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "importance",
"type": "str",
"description": "The importance level for the event.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "source",
"type": "str",
"description": "Source of the data.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "currency",
"type": "str",
"description": "Currency of the data.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "unit",
"type": "str",
"description": "Unit of the data.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "consensus",
"type": "Union[str, float]",
"description": "Average forecast among a representative group of economists.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "previous",
"type": "Union[str, float]",
"description": "Value for the previous period after the revision (if revision is applicable).",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "revised",
"type": "Union[str, float]",
"description": "Revised previous value, if applicable.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "actual",
"type": "Union[str, float]",
"description": "Latest released value.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"fmp": [
@@ -2354,28 +2792,32 @@
"type": "float",
"description": "Value change since previous.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "change_percent",
"type": "float",
"description": "Percentage change since previous.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "last_updated",
"type": "datetime",
"description": "Last updated timestamp.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "created_at",
"type": "datetime",
"description": "Created at timestamp.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"tradingeconomics": [
@@ -2384,70 +2826,80 @@
"type": "Union[str, float]",
"description": "TradingEconomics projections.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "reference",
"type": "str",
"description": "Abbreviated period for which released data refers to.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "reference_date",
"type": "date",
"description": "Date for the reference period.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "calendar_id",
"type": "int",
"description": "TradingEconomics Calendar ID.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "date_span",
"type": "int",
"description": "Date span of the event.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "symbol",
"type": "str",
"description": "TradingEconomics Symbol.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "ticker",
"type": "str",
"description": "TradingEconomics Ticker symbol.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "te_url",
"type": "str",
"description": "TradingEconomics URL path.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "source_url",
"type": "str",
"description": "Source URL.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "last_updated",
"type": "datetime",
"description": "Last update of the data.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -2467,42 +2919,98 @@
"type": "Union[str, List[str]]",
"description": "The country to get data. Multiple items allowed for provider(s): fred.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": [
+ "australia",
+ "austria",
+ "belgium",
+ "brazil",
+ "bulgaria",
+ "canada",
+ "chile",
+ "china",
+ "croatia",
+ "cyprus",
+ "czech_republic",
+ "denmark",
+ "estonia",
+ "euro_area",
+ "finland",
+ "france",
+ "germany",
+ "greece",
+ "hungary",
+ "iceland",
+ "india",
+ "indonesia",
+ "ireland",
+ "israel",
+ "italy",
+ "japan",
+ "korea",
+ "latvia",
+ "lithuania",
+ "luxembourg",
+ "malta",
+ "mexico",
+ "netherlands",
+ "new_zealand",
+ "norway",
+ "poland",
+ "portugal",
+ "romania",
+ "russian_federation",
+ "slovak_republic",
+ "slovakia",
+ "slovenia",
+ "south_africa",
+ "spain",
+ "sweden",
+ "switzerland",
+ "turkey",
+ "united_kingdom",
+ "united_states"
+ ]
},
{
"name": "units",
"type": "Literal['growth_previous', 'growth_same', 'index_2015']",
"description": "The unit of measurement for the data. Options: - `growth_previous`: Percent growth from the previous period. If monthly data, this is month-over-month, etc - `growth_same`: Percent growth from the same period in the previous year. If looking at monthly data, this would be year-over-year, etc. - `index_2015`: Rescaled index value, such that the value in 2015 is 100.",
"default": "growth_same",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "frequency",
"type": "Literal['monthly', 'quarter', 'annual']",
"description": "The frequency of the data. Options: `monthly`, `quarter`, and `annual`.",
"default": "monthly",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "harmonized",
"type": "bool",
"description": "Whether you wish to obtain harmonized data.",
"default": false,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "start_date",
"type": "Union[date, str]",
"description": "Start date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "end_date",
"type": "Union[date, str]",
"description": "End date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -2550,7 +3058,8 @@
"type": "date",
"description": "The date of the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
],
"fred": []
@@ -2612,28 +3121,32 @@
"type": "str",
"description": "Market country.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "continent",
"type": "str",
"description": "Continent of the country.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "total_equity_risk_premium",
"type": "Annotated[float, Gt(gt=0)]",
"description": "Total equity risk premium for the country.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "country_risk_premium",
"type": "Annotated[float, Ge(ge=0)]",
"description": "Country-specific risk premium.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"fmp": []
@@ -2654,7 +3167,8 @@
"type": "str",
"description": "The search word(s).",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -2670,63 +3184,72 @@
"type": "bool",
"description": "Is release? If True, other search filter variables are ignored. If no query text or release_id is supplied, this defaults to True.",
"default": false,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "release_id",
"type": "Union[int, str]",
"description": "A specific release ID to target.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "limit",
"type": "int",
"description": "The number of data entries to return. (1-1000)",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "offset",
"type": "Annotated[int, Ge(ge=0)]",
"description": "Offset the results in conjunction with limit.",
"default": 0,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "filter_variable",
"type": "Literal['frequency', 'units', 'seasonal_adjustment']",
"description": "Filter by an attribute.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "filter_value",
"type": "str",
"description": "String value to filter the variable by. Used in conjunction with filter_variable.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "tag_names",
"type": "str",
"description": "A semicolon delimited list of tag names that series match all of. Example: 'japan;imports'",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "exclude_tag_names",
"type": "str",
"description": "A semicolon delimited list of tag names that series match none of. Example: 'imports;services'. Requires that variable tag_names also be set to limit the number of matching series.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "series_id",
"type": "str",
"description": "A FRED Series ID to return series group information for. This returns the required information to query for regional data. Not all series that are in FRED have geographical data. Entering a value for series_id will override all other parameters. Multiple series_ids can be separated by commas.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -2766,112 +3289,128 @@
"type": "Union[int, str]",
"description": "The release ID for queries.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "series_id",
"type": "str",
"description": "The series ID for the item in the release.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "name",
"type": "str",
"description": "The name of the release.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "title",
"type": "str",
"description": "The title of the series.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "observation_start",
"type": "date",
"description": "The date of the first observation in the series.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "observation_end",
"type": "date",
"description": "The date of the last observation in the series.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "frequency",
"type": "str",
"description": "The frequency of the data.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "frequency_short",
"type": "str",
"description": "Short form of the data frequency.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "units",
"type": "str",
"description": "The units of the data.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "units_short",
"type": "str",
"description": "Short form of the data units.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "seasonal_adjustment",
"type": "str",
"description": "The seasonal adjustment of the data.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "seasonal_adjustment_short",
"type": "str",
"description": "Short form of the data seasonal adjustment.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "last_updated",
"type": "datetime",
"description": "The datetime of the last update to the data.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "notes",
"type": "str",
"description": "Description of the release.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "press_release",
"type": "bool",
"description": "If the release is a press release.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "url",
"type": "str",
"description": "URL to the release.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"fred": [
@@ -2880,28 +3419,32 @@
"type": "int",
"description": "Popularity of the series",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "group_popularity",
"type": "int",
"description": "Group popularity of the release",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "region_type",
"type": "str",
"description": "The region type of the series.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "series_group",
"type": "Union[int, str]",
"description": "The series group ID of the series. This value is used to query for regional data.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -2921,28 +3464,32 @@
"type": "Union[str, List[str]]",
"description": "Symbol to get data for. Multiple items allowed for provider(s): fred.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "start_date",
"type": "Union[date, str]",
"description": "Start date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "end_date",
"type": "Union[date, str]",
"description": "End date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "limit",
"type": "int",
"description": "The number of data entries to return.",
"default": 100000,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -2958,28 +3505,32 @@
"type": "int",
"description": "The number of data entries to return.",
"default": 100000,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "frequency",
"type": "Literal['a', 'q', 'm', 'w', 'd', 'wef', 'weth', 'wew', 'wetu', 'wem', 'wesu', 'wesa', 'bwew', 'bwem']",
"description": "Frequency aggregation to convert high frequency data to lower frequency. None = No change a = Annual q = Quarterly m = Monthly w = Weekly d = Daily wef = Weekly, Ending Friday weth = Weekly, Ending Thursday wew = Weekly, Ending Wednesday wetu = Weekly, Ending Tuesday wem = Weekly, Ending Monday wesu = Weekly, Ending Sunday wesa = Weekly, Ending Saturday bwew = Biweekly, Ending Wednesday bwem = Biweekly, Ending Monday",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "aggregation_method",
"type": "Literal['avg', 'sum', 'eop']",
"description": "A key that indicates the aggregation method used for frequency aggregation. This parameter has no affect if the frequency parameter is not set. avg = Average sum = Sum eop = End of Period",
"default": "eop",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "transform",
"type": "Literal['chg', 'ch1', 'pch', 'pc1', 'pca', 'cch', 'cca', 'log']",
"description": "Transformation type None = No transformation chg = Change ch1 = Change from Year Ago pch = Percent Change pc1 = Percent Change from Year Ago pca = Compounded Annual Rate of Change cch = Continuously Compounded Rate of Change cca = Continuously Compounded Annual Rate of Change log = Natural Log",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"intrinio": [
@@ -2988,14 +3539,16 @@
"type": "bool",
"description": "Returns all pages of data from the API call at once.",
"default": false,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "sleep",
"type": "float",
"description": "Time to sleep between requests to avoid rate limiting.",
"default": 1.0,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -3035,7 +3588,8 @@
"type": "date",
"description": "The date of the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
],
"fred": [],
@@ -3045,7 +3599,8 @@
"type": "float",
"description": "Value of the index.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -3065,21 +3620,24 @@
"type": "Union[date, str]",
"description": "Start date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "end_date",
"type": "Union[date, str]",
"description": "End date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "adjusted",
"type": "bool",
"description": "Whether to return seasonally adjusted data.",
"default": true,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -3127,56 +3685,64 @@
"type": "date",
"description": "The date of the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "M1",
"type": "float",
"description": "Value of the M1 money supply in billions.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "M2",
"type": "float",
"description": "Value of the M2 money supply in billions.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "currency",
"type": "float",
"description": "Value of currency in circulation in billions.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "demand_deposits",
"type": "float",
"description": "Value of demand deposits in billions.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "retail_money_market_funds",
"type": "float",
"description": "Value of retail money market funds in billions.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "other_liquid_deposits",
"type": "float",
"description": "Value of other liquid deposits in billions.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "small_denomination_time_deposits",
"type": "float",
"description": "Value of small denomination time deposits in billions.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"federal_reserve": []
@@ -3197,14 +3763,16 @@
"type": "Union[date, str]",
"description": "Start date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "end_date",
"type": "Union[date, str]",
"description": "End date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -3220,35 +3788,40 @@
"type": "Literal['colombia', 'new_zealand', 'united_kingdom', 'italy', 'luxembourg', 'euro_area19', 'sweden', 'oecd', 'south_africa', 'denmark', 'canada', 'switzerland', 'slovakia', 'hungary', 'portugal', 'spain', 'france', 'czech_republic', 'costa_rica', 'japan', 'slovenia', 'russia', 'austria', 'latvia', 'netherlands', 'israel', 'iceland', 'united_states', 'ireland', 'mexico', 'germany', 'greece', 'turkey', 'australia', 'poland', 'south_korea', 'chile', 'finland', 'european_union27_2020', 'norway', 'lithuania', 'euro_area20', 'estonia', 'belgium', 'brazil', 'indonesia', 'all']",
"description": "Country to get GDP for.",
"default": "united_states",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "sex",
"type": "Literal['total', 'male', 'female']",
"description": "Sex to get unemployment for.",
"default": "total",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "frequency",
"type": "Literal['monthly', 'quarterly', 'annual']",
"description": "Frequency to get unemployment for.",
"default": "monthly",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "age",
"type": "Literal['total', '15-24', '15-64', '25-54', '55-64']",
"description": "Age group to get unemployment for. Total indicates 15 years or over",
"default": "total",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "seasonal_adjustment",
"type": "bool",
"description": "Whether to get seasonally adjusted unemployment. Defaults to False.",
"default": false,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -3288,21 +3861,24 @@
"type": "date",
"description": "The date of the data.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "value",
"type": "float",
"description": "Unemployment rate (given as a whole number, i.e 10=10%)",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "country",
"type": "str",
"description": "Country for which unemployment rate is given",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"oecd": []
@@ -3323,14 +3899,16 @@
"type": "Union[date, str]",
"description": "Start date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "end_date",
"type": "Union[date, str]",
"description": "End date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -3346,7 +3924,8 @@
"type": "Literal['united_states', 'united_kingdom', 'japan', 'mexico', 'indonesia', 'australia', 'brazil', 'canada', 'italy', 'germany', 'turkey', 'france', 'south_africa', 'south_korea', 'spain', 'india', 'china', 'g7', 'g20', 'all']",
"description": "Country to get GDP for.",
"default": "united_states",
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -3386,21 +3965,24 @@
"type": "date",
"description": "The date of the data.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "value",
"type": "float",
"description": "CLI value",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "country",
"type": "str",
"description": "Country for which CLI is given",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"oecd": []
@@ -3421,14 +4003,16 @@
"type": "Union[date, str]",
"description": "Start date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "end_date",
"type": "Union[date, str]",
"description": "End date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -3444,14 +4028,16 @@
"type": "Literal['belgium', 'ireland', 'mexico', 'indonesia', 'new_zealand', 'japan', 'united_kingdom', 'france', 'chile', 'canada', 'netherlands', 'united_states', 'south_korea', 'norway', 'austria', 'south_africa', 'denmark', 'switzerland', 'hungary', 'luxembourg', 'australia', 'germany', 'sweden', 'iceland', 'turkey', 'greece', 'israel', 'czech_republic', 'latvia', 'slovenia', 'poland', 'estonia', 'lithuania', 'portugal', 'costa_rica', 'slovakia', 'finland', 'spain', 'russia', 'euro_area19', 'colombia', 'italy', 'india', 'china', 'croatia', 'all']",
"description": "Country to get GDP for.",
"default": "united_states",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "frequency",
"type": "Literal['monthly', 'quarterly', 'annual']",
"description": "Frequency to get interest rate for for.",
"default": "monthly",
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -3491,21 +4077,24 @@
"type": "date",
"description": "The date of the data.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "value",
"type": "float",
"description": "Interest rate (given as a whole number, i.e 10=10%)",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "country",
"type": "str",
"description": "Country for which interest rate is given",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"oecd": []
@@ -3526,14 +4115,16 @@
"type": "Union[date, str]",
"description": "Start date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "end_date",
"type": "Union[date, str]",
"description": "End date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -3549,14 +4140,16 @@
"type": "Literal['belgium', 'ireland', 'mexico', 'indonesia', 'new_zealand', 'japan', 'united_kingdom', 'france', 'chile', 'canada', 'netherlands', 'united_states', 'south_korea', 'norway', 'austria', 'south_africa', 'denmark', 'switzerland', 'hungary', 'luxembourg', 'australia', 'germany', 'sweden', 'iceland', 'turkey', 'greece', 'israel', 'czech_republic', 'latvia', 'slovenia', 'poland', 'estonia', 'lithuania', 'portugal', 'costa_rica', 'slovakia', 'finland', 'spain', 'russia', 'euro_area19', 'colombia', 'italy', 'india', 'china', 'croatia', 'all']",
"description": "Country to get GDP for.",
"default": "united_states",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "frequency",
"type": "Literal['monthly', 'quarterly', 'annual']",
"description": "Frequency to get interest rate for for.",
"default": "monthly",
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -3596,21 +4189,24 @@
"type": "date",
"description": "The date of the data.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "value",
"type": "float",
"description": "Interest rate (given as a whole number, i.e 10=10%)",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "country",
"type": "str",
"description": "Country for which interest rate is given",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"oecd": []
@@ -3631,28 +4227,32 @@
"type": "str",
"description": "Symbol to get data for.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "start_date",
"type": "Union[date, str]",
"description": "Start date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "end_date",
"type": "Union[date, str]",
"description": "End date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "limit",
"type": "int",
"description": "The number of data entries to return.",
"default": 100000,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -3668,56 +4268,64 @@
"type": "str",
"description": "For this function, it is the series_group ID or series ID. If the symbol provided is for a series_group, set the `is_series_group` parameter to True. Not all series that are in FRED have geographical data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "is_series_group",
"type": "bool",
"description": "When True, the symbol provided is for a series_group, else it is for a series ID.",
"default": false,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "region_type",
"type": "Literal['bea', 'msa', 'frb', 'necta', 'state', 'country', 'county', 'censusregion']",
"description": "The type of regional data. Parameter is only valid when `is_series_group` is True.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "season",
"type": "Literal['SA', 'NSA', 'SSA']",
"description": "The seasonal adjustments to the data. Parameter is only valid when `is_series_group` is True.",
"default": "NSA",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "units",
"type": "str",
"description": "The units of the data. This should match the units returned from searching by series ID. An incorrect field will not necessarily return an error. Parameter is only valid when `is_series_group` is True.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "frequency",
"type": "Literal['d', 'w', 'bw', 'm', 'q', 'sa', 'a', 'wef', 'weth', 'wew', 'wetu', 'wem', 'wesu', 'wesa', 'bwew', 'bwem']",
"description": "Frequency aggregation to convert high frequency data to lower frequency. Parameter is only valid when `is_series_group` is True. a = Annual sa= Semiannual q = Quarterly m = Monthly w = Weekly d = Daily wef = Weekly, Ending Friday weth = Weekly, Ending Thursday wew = Weekly, Ending Wednesday wetu = Weekly, Ending Tuesday wem = Weekly, Ending Monday wesu = Weekly, Ending Sunday wesa = Weekly, Ending Saturday bwew = Biweekly, Ending Wednesday bwem = Biweekly, Ending Monday",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "aggregation_method",
"type": "Literal['avg', 'sum', 'eop']",
"description": "A key that indicates the aggregation method used for frequency aggregation. This parameter has no affect if the frequency parameter is not set. Only valid when `is_series_group` is True. avg = Average sum = Sum eop = End of Period",
"default": "avg",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "transform",
"type": "Literal['lin', 'chg', 'ch1', 'pch', 'pc1', 'pca', 'cch', 'cca', 'log']",
"description": "Transformation type. Only valid when `is_series_group` is True. lin = Levels (No transformation) chg = Change ch1 = Change from Year Ago pch = Percent Change pc1 = Percent Change from Year Ago pca = Compounded Annual Rate of Change cch = Continuously Compounded Rate of Change cca = Continuously Compounded Annual Rate of Change log = Natural Log",
"default": "lin",
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -3757,7 +4365,8 @@
"type": "date",
"description": "The date of the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
],
"fred": [
@@ -3766,28 +4375,32 @@
"type": "str",
"description": "The name of the region.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "code",
"type": "Union[str, int]",
"description": "The code of the region.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "value",
"type": "Union[int, float]",
"description": "The obersvation value. The units are defined in the search results by series ID.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "series_id",
"type": "str",
"description": "The individual series ID for the region.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
]
},
@@ -3807,7 +4420,8 @@
"type": "Union[str, List[str]]",
"description": "The country to get data. Multiple items allowed for provider(s): econdb.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "provider",
@@ -3823,14 +4437,16 @@
"type": "bool",
"description": "If True, return only the latest data. If False, return all available data for each indicator.",
"default": true,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "use_cache",
"type": "bool",
"description": "If True, the request will be cached for one day.Using cache is recommended to avoid needlessly requesting the same data.",
"default": true,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -3870,98 +4486,112 @@
"type": "str",
"description": "",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "population",
"type": "int",
"description": "Population.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "gdp_usd",
"type": "float",
"description": "Gross Domestic Product, in billions of USD.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "gdp_qoq",
"type": "float",
"description": "GDP growth quarter-over-quarter change, as a normalized percent.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "gdp_yoy",
"type": "float",
"description": "GDP growth year-over-year change, as a normalized percent.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "cpi_yoy",
"type": "float",
"description": "Consumer Price Index year-over-year change, as a normalized percent.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "core_yoy",
"type": "float",
"description": "Core Consumer Price Index year-over-year change, as a normalized percent.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "retail_sales_yoy",
"type": "float",
"description": "Retail Sales year-over-year change, as a normalized percent.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "industrial_production_yoy",
"type": "float",
"description": "Industrial Production year-over-year change, as a normalized percent.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "policy_rate",
"type": "float",
"description": "Short term policy rate, as a normalized percent.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "yield_10y",
"type": "float",
"description": "10-year government bond yield, as a normalized percent.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "govt_debt_gdp",
"type": "float",
"description": "Government debt as a percent (normalized) of GDP.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "current_account_gdp",
"type": "float",
"description": "Current account balance as a percent (normalized) of GDP.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "jobless_rate",
"type": "float",
"description": "Unemployment rate, as a normalized percent.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"econdb": []
@@ -3991,7 +4621,8 @@
"type": "bool",
"description": "Whether to use cache or not, by default is True The cache of indicator symbols will persist for one week.",
"default": true,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -4031,42 +4662,48 @@
"type": "str",
"description": "The root symbol representing the indicator.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "symbol",
"type": "str",
"description": "Symbol representing the entity requested in the data. The root symbol with additional codes.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "country",
"type": "str",
"description": "The name of the country, region, or entity represented by the symbol.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "iso",
"type": "str",
"description": "The ISO code of the country, region, or entity represented by the symbol.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "description",
"type": "str",
"description": "The description of the indicator.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "frequency",
"type": "str",
"description": "The frequency of the indicator data.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"econdb": [
@@ -4075,56 +4712,64 @@
"type": "str",
"description": "The currency, or unit, the data is based in.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "scale",
"type": "str",
"description": "The scale of the data.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "multiplier",
"type": "int",
"description": "The multiplier of the data to arrive at whole units.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "transformation",
"type": "str",
"description": "Transformation type.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "source",
"type": "str",
"description": "The original source of the data.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "first_date",
"type": "date",
"description": "The first date of the data.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "last_date",
"type": "date",
"description": "The last date of the data.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "last_insert_timestamp",
"type": "datetime",
"description": "The time of the last update. Data is typically reported with a lag.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -4144,28 +4789,32 @@
"type": "Union[str, List[str]]",
"description": "Symbol to get data for. The base symbol for the indicator (e.g. GDP, CPI, etc.). Multiple items allowed for provider(s): econdb.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "country",
"type": "Union[str, List[str]]",
"description": "The country to get data. The country represented by the indicator, if available. Multiple items allowed for provider(s): econdb.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "start_date",
"type": "Union[date, str]",
"description": "Start date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "end_date",
"type": "Union[date, str]",
"description": "End date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -4181,21 +4830,24 @@
"type": "Literal['toya', 'tpop', 'tusd', 'tpgp']",
"description": "The transformation to apply to the data, default is None. tpop: Change from previous period toya: Change from one year ago tusd: Values as US dollars tpgp: Values as a percent of GDP Only 'tpop' and 'toya' are applicable to all indicators. Applying transformations across multiple indicators/countries may produce unexpected results. This is because not all indicators are compatible with all transformations, and the original units and scale differ between entities. `tusd` should only be used where values are currencies.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "frequency",
"type": "Literal['annual', 'quarter', 'month']",
"description": "The frequency of the data, default is 'quarter'. Only valid when 'symbol' is 'main'.",
"default": "quarter",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "use_cache",
"type": "bool",
"description": "If True, the request will be cached for one day. Using cache is recommended to avoid needlessly requesting the same data.",
"default": true,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -4235,35 +4887,40 @@
"type": "date",
"description": "The date of the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "symbol_root",
"type": "str",
"description": "The root symbol for the indicator (e.g. GDP).",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "symbol",
"type": "str",
"description": "Symbol representing the entity requested in the data.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "country",
"type": "str",
"description": "The country represented by the data.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "value",
"type": "Union[int, float]",
"description": "",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"econdb": []
@@ -4284,28 +4941,32 @@
"type": "str",
"description": "Symbol to get data for.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "start_date",
"type": "Union[date, str]",
"description": "Start date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "end_date",
"type": "Union[date, str]",
"description": "End date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "limit",
"type": "int",
"description": "The number of data entries to return.",
"default": 100,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -4321,21 +4982,24 @@
"type": "Literal['upcoming', 'priced', 'withdrawn']",
"description": "Status of the IPO. [upcoming, priced, or withdrawn]",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "min_value",
"type": "int",
"description": "Return IPOs with an offer dollar amount greater than the given amount.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "max_value",
"type": "int",
"description": "Return IPOs with an offer dollar amount less than the given amount.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -4375,14 +5039,16 @@
"type": "str",
"description": "Symbol representing the entity requested in the data.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "ipo_date",
"type": "date",
"description": "The date of the IPO, when the stock first trades on a major exchange.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"intrinio": [
@@ -4391,140 +5057,160 @@
"type": "Literal['upcoming', 'priced', 'withdrawn']",
"description": "The status of the IPO. Upcoming IPOs have not taken place yet but are expected to. Priced IPOs have taken place. Withdrawn IPOs were expected to take place, but were subsequently withdrawn.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "exchange",
"type": "str",
"description": "The acronym of the stock exchange that the company is going to trade publicly on. Typically NYSE or NASDAQ.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "offer_amount",
"type": "float",
"description": "The total dollar amount of shares offered in the IPO. Typically this is share price * share count",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "share_price",
"type": "float",
"description": "The price per share at which the IPO was offered.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "share_price_lowest",
"type": "float",
"description": "The expected lowest price per share at which the IPO will be offered. Before an IPO is priced, companies typically provide a range of prices per share at which they expect to offer the IPO (typically available for upcoming IPOs).",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "share_price_highest",
"type": "float",
"description": "The expected highest price per share at which the IPO will be offered. Before an IPO is priced, companies typically provide a range of prices per share at which they expect to offer the IPO (typically available for upcoming IPOs).",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "share_count",
"type": "int",
"description": "The number of shares offered in the IPO.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "share_count_lowest",
"type": "int",
"description": "The expected lowest number of shares that will be offered in the IPO. Before an IPO is priced, companies typically provide a range of shares that they expect to offer in the IPO (typically available for upcoming IPOs).",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "share_count_highest",
"type": "int",
"description": "The expected highest number of shares that will be offered in the IPO. Before an IPO is priced, companies typically provide a range of shares that they expect to offer in the IPO (typically available for upcoming IPOs).",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "announcement_url",
"type": "str",
"description": "The URL to the company's announcement of the IPO",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "sec_report_url",
"type": "str",
"description": "The URL to the company's S-1, S-1/A, F-1, or F-1/A SEC filing, which is required to be filed before an IPO takes place.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "open_price",
"type": "float",
"description": "The opening price at the beginning of the first trading day (only available for priced IPOs).",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "close_price",
"type": "float",
"description": "The closing price at the end of the first trading day (only available for priced IPOs).",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "volume",
"type": "int",
"description": "The volume at the end of the first trading day (only available for priced IPOs).",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "day_change",
"type": "float",
"description": "The percentage change between the open price and the close price on the first trading day (only available for priced IPOs).",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "week_change",
"type": "float",
"description": "The percentage change between the open price on the first trading day and the close price approximately a week after the first trading day (only available for priced IPOs).",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "month_change",
"type": "float",
"description": "The percentage change between the open price on the first trading day and the close price approximately a month after the first trading day (only available for priced IPOs).",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "id",
"type": "str",
"description": "The Intrinio ID of the IPO.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "company",
"type": "IntrinioCompany",
"description": "The company that is going public via the IPO.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "security",
"type": "IntrinioSecurity",
"description": "The primary Security for the Company that is going public via the IPO",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -4544,14 +5230,16 @@
"type": "Union[date, str]",
"description": "Start date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "end_date",
"type": "Union[date, str]",
"description": "End date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -4599,49 +5287,56 @@
"type": "date",
"description": "The ex-dividend date - the date on which the stock begins trading without rights to the dividend.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "symbol",
"type": "str",
"description": "Symbol representing the entity requested in the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "amount",
"type": "float",
"description": "The dividend amount per share.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "name",
"type": "str",
"description": "Name of the entity.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "record_date",
"type": "date",
"description": "The record date of ownership for eligibility.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "payment_date",
"type": "date",
"description": "The payment date of the dividend.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "declaration_date",
"type": "date",
"description": "Declaration date of the dividend.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"fmp": [
@@ -4650,14 +5345,16 @@
"type": "float",
"description": "The adjusted-dividend amount.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "label",
"type": "str",
"description": "Ex-dividend date formatted for display.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -4677,14 +5374,16 @@
"type": "Union[date, str]",
"description": "Start date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "end_date",
"type": "Union[date, str]",
"description": "End date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -4732,35 +5431,40 @@
"type": "date",
"description": "The date of the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "label",
"type": "str",
"description": "Label of the stock splits.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "symbol",
"type": "str",
"description": "Symbol representing the entity requested in the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "numerator",
"type": "float",
"description": "Numerator of the stock splits.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "denominator",
"type": "float",
"description": "Denominator of the stock splits.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
],
"fmp": []
@@ -4781,14 +5485,16 @@
"type": "Union[date, str]",
"description": "Start date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "end_date",
"type": "Union[date, str]",
"description": "End date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -4836,35 +5542,40 @@
"type": "date",
"description": "The date of the earnings report.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "symbol",
"type": "str",
"description": "Symbol representing the entity requested in the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "name",
"type": "str",
"description": "Name of the entity.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "eps_previous",
"type": "float",
"description": "The earnings-per-share from the same previously reported period.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "eps_consensus",
"type": "float",
"description": "The analyst conesus earnings-per-share estimate.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"fmp": [
@@ -4873,42 +5584,48 @@
"type": "float",
"description": "The actual earnings per share announced.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "revenue_actual",
"type": "float",
"description": "The actual reported revenue.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "revenue_consensus",
"type": "float",
"description": "The revenue forecast consensus.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "period_ending",
"type": "date",
"description": "The fiscal period end date.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "reporting_time",
"type": "str",
"description": "The reporting time - e.g. after market close.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "updated_date",
"type": "date",
"description": "The date the data was updated last.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -4928,7 +5645,8 @@
"type": "str",
"description": "Symbol to get data for.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "provider",
@@ -4976,7 +5694,8 @@
"type": "List[str]",
"description": "A list of equity peers based on sector, exchange and market cap.",
"default": "",
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"fmp": []
@@ -4997,14 +5716,16 @@
"type": "Union[str, List[str]]",
"description": "Symbol to get data for. Multiple items allowed for provider(s): benzinga, fmp.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "limit",
"type": "int",
"description": "The number of data entries to return.",
"default": 200,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -5020,70 +5741,80 @@
"type": "int",
"description": "Page offset. For optimization, performance and technical reasons, page offsets are limited from 0 - 100000. Limit the query results by other parameters such as date. Used in conjunction with the limit and date parameters.",
"default": 0,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "date",
"type": "Union[date, str]",
"description": "Date for calendar data, shorthand for date_from and date_to.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "start_date",
"type": "Union[date, str]",
"description": "Start date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "end_date",
"type": "Union[date, str]",
"description": "End date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "updated",
"type": "Union[date, int]",
"description": "Records last Updated Unix timestamp (UTC). This will force the sort order to be Greater Than or Equal to the timestamp indicated. The date can be a date string or a Unix timestamp. The date string must be in the format of YYYY-MM-DD.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "importance",
"type": "int",
"description": "Importance level to filter by. Uses Greater Than or Equal To the importance indicated",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "action",
"type": "Literal['downgrades', 'maintains', 'reinstates', 'reiterates', 'upgrades', 'assumes', 'initiates', 'terminates', 'removes', 'suspends', 'firm_dissolved']",
"description": "Filter by a specific action_company.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "analyst_ids",
"type": "Union[List[str], str]",
"description": "Comma-separated list of analyst (person) IDs. Omitting will bring back all available analysts.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "firm_ids",
"type": "Union[List[str], str]",
"description": "Comma-separated list of firm IDs.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "fields",
"type": "Union[List[str], str]",
"description": "Comma-separated list of fields to include in the response. See https://docs.benzinga.io/benzinga-apis/calendar/get-ratings to learn about the available fields.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"fmp": [
@@ -5092,7 +5823,8 @@
"type": "bool",
"description": "Include upgrades and downgrades in the response.",
"default": false,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -5132,112 +5864,128 @@
"type": "Union[date, datetime]",
"description": "Published date of the price target.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "published_time",
"type": "datetime.time",
"description": "Time of the original rating, UTC.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "symbol",
"type": "str",
"description": "Symbol representing the entity requested in the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "exchange",
"type": "str",
"description": "Exchange where the company is traded.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "company_name",
"type": "str",
"description": "Name of company that is the subject of rating.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "analyst_name",
"type": "str",
"description": "Analyst name.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "analyst_firm",
"type": "str",
"description": "Name of the analyst firm that published the price target.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "currency",
"type": "str",
"description": "Currency the data is denominated in.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "price_target",
"type": "float",
"description": "The current price target.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "adj_price_target",
"type": "float",
"description": "Adjusted price target for splits and stock dividends.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "price_target_previous",
"type": "float",
"description": "Previous price target.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "previous_adj_price_target",
"type": "float",
"description": "Previous adjusted price target.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "price_when_posted",
"type": "float",
"description": "Price when posted.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "rating_current",
"type": "str",
"description": "The analyst's rating for the company.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "rating_previous",
"type": "str",
"description": "Previous analyst rating for the company.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "action",
"type": "str",
"description": "Description of the change in rating from firm's last rating.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"benzinga": [
@@ -5246,63 +5994,72 @@
"type": "Literal['Downgrades', 'Maintains', 'Reinstates', 'Reiterates', 'Upgrades', 'Assumes', 'Initiates Coverage On', 'Terminates Coverage On', 'Removes', 'Suspends', 'Firm Dissolved']",
"description": "Description of the change in rating from firm's last rating.Note that all of these terms are precisely defined.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "action_change",
"type": "Literal['Announces', 'Maintains', 'Lowers', 'Raises', 'Removes', 'Adjusts']",
"description": "Description of the change in price target from firm's last price target.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "importance",
"type": "Literal[0, 1, 2, 3, 4, 5]",
"description": "Subjective Basis of How Important Event is to Market. 5 = High",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "notes",
"type": "str",
"description": "Notes of the price target.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "analyst_id",
"type": "str",
"description": "Id of the analyst.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "url_news",
"type": "str",
"description": "URL for analyst ratings news articles for this ticker on Benzinga.com.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "url_analyst",
"type": "str",
"description": "URL for analyst ratings page for this ticker on Benzinga.com.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "id",
"type": "str",
"description": "Unique ID of this entry.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "last_updated",
"type": "datetime",
"description": "Last updated timestamp, UTC.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"fmp": [
@@ -5311,28 +6068,32 @@
"type": "str",
"description": "News URL of the price target.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "news_title",
"type": "str",
"description": "News title of the price target.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "news_publisher",
"type": "str",
"description": "News publisher of the price target.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "news_base_url",
"type": "str",
"description": "News base URL of the price target.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -5352,7 +6113,8 @@
"type": "Union[str, List[str]]",
"description": "Symbol to get data for. Multiple items allowed for provider(s): fmp.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "provider",
@@ -5368,14 +6130,16 @@
"type": "Literal['quarter', 'annual']",
"description": "Time period of the data to return.",
"default": "annual",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "limit",
"type": "int",
"description": "The number of data entries to return.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -5415,154 +6179,176 @@
"type": "str",
"description": "Symbol representing the entity requested in the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "date",
"type": "date",
"description": "The date of the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "estimated_revenue_low",
"type": "int",
"description": "Estimated revenue low.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "estimated_revenue_high",
"type": "int",
"description": "Estimated revenue high.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "estimated_revenue_avg",
"type": "int",
"description": "Estimated revenue average.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "estimated_sga_expense_low",
"type": "int",
"description": "Estimated SGA expense low.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "estimated_sga_expense_high",
"type": "int",
"description": "Estimated SGA expense high.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "estimated_sga_expense_avg",
"type": "int",
"description": "Estimated SGA expense average.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "estimated_ebitda_low",
"type": "int",
"description": "Estimated EBITDA low.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "estimated_ebitda_high",
"type": "int",
"description": "Estimated EBITDA high.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "estimated_ebitda_avg",
"type": "int",
"description": "Estimated EBITDA average.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "estimated_ebit_low",
"type": "int",
"description": "Estimated EBIT low.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "estimated_ebit_high",
"type": "int",
"description": "Estimated EBIT high.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "estimated_ebit_avg",
"type": "int",
"description": "Estimated EBIT average.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "estimated_net_income_low",
"type": "int",
"description": "Estimated net income low.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "estimated_net_income_high",
"type": "int",
"description": "Estimated net income high.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "estimated_net_income_avg",
"type": "int",
"description": "Estimated net income average.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "estimated_eps_avg",
"type": "float",
"description": "Estimated EPS average.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "estimated_eps_high",
"type": "float",
"description": "Estimated EPS high.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "estimated_eps_low",
"type": "float",
"description": "Estimated EPS low.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "number_analyst_estimated_revenue",
"type": "int",
"description": "Number of analysts who estimated revenue.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "number_analysts_estimated_eps",
"type": "int",
"description": "Number of analysts who estimated EPS.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"fmp": []
@@ -5583,7 +6369,8 @@
"type": "Union[str, List[str]]",
"description": "Symbol to get data for. Multiple items allowed for provider(s): fmp, intrinio, yfinance.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -5600,7 +6387,8 @@
"type": "int",
"description": "The Zacks industry group number.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"yfinance": []
@@ -5641,42 +6429,48 @@
"type": "str",
"description": "Symbol representing the entity requested in the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "name",
"type": "str",
"description": "The company name",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "target_high",
"type": "float",
"description": "High target of the price target consensus.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "target_low",
"type": "float",
"description": "Low target of the price target consensus.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "target_consensus",
"type": "float",
"description": "Consensus target of the price target consensus.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "target_median",
"type": "float",
"description": "Median target of the price target consensus.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"fmp": [],
@@ -5686,42 +6480,48 @@
"type": "float",
"description": "The standard deviation of target price estimates.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "total_anaylsts",
"type": "int",
"description": "The total number of target price estimates in consensus.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "raised",
"type": "int",
"description": "The number of analysts that have raised their target price estimates.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "lowered",
"type": "int",
"description": "The number of analysts that have lowered their target price estimates.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "most_recent_date",
"type": "date",
"description": "The date of the most recent estimate.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "industry_group_number",
"type": "int",
"description": "The Zacks industry group number.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"yfinance": [
@@ -5730,35 +6530,40 @@
"type": "str",
"description": "Recommendation - buy, sell, etc.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "recommendation_mean",
"type": "float",
"description": "Mean recommendation score where 1 is strong buy and 5 is strong sell.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "number_of_analysts",
"type": "int",
"description": "Number of analysts providing opinions.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "current_price",
"type": "float",
"description": "Current price of the stock.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "currency",
"type": "str",
"description": "Currency the stock is priced in.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -5778,14 +6583,16 @@
"type": "Union[str, List[str]]",
"description": "Analyst names to return. Omitting will return all available analysts. Multiple items allowed for provider(s): benzinga.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "firm_name",
"type": "Union[str, List[str]]",
"description": "Firm names to return. Omitting will return all available firms. Multiple items allowed for provider(s): benzinga.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -5801,35 +6608,40 @@
"type": "Union[str, List[str]]",
"description": "List of analyst IDs to return. Multiple items allowed for provider(s): benzinga.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "firm_ids",
"type": "Union[str, List[str]]",
"description": "Firm IDs to return. Multiple items allowed for provider(s): benzinga.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "limit",
"type": "int",
"description": "Number of results returned. Limit 1000.",
"default": 100,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "page",
"type": "int",
"description": "Page offset. For optimization, performance and technical reasons, page offsets are limited from 0 - 100000. Limit the query results by other parameters such as date.",
"default": 0,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "fields",
"type": "Union[str, List[str]]",
"description": "Fields to include in the response. See https://docs.benzinga.io/benzinga-apis/calendar/get-ratings to learn about the available fields. Multiple items allowed for provider(s): benzinga.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -5869,35 +6681,40 @@
"type": "datetime",
"description": "Date of the last update.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "firm_name",
"type": "str",
"description": "Firm name of the analyst.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "name_first",
"type": "str",
"description": "Analyst first name.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "name_last",
"type": "str",
"description": "Analyst last name.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "name_full",
"type": "str",
"description": "Analyst full name.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
],
"benzinga": [
@@ -5906,357 +6723,408 @@
"type": "str",
"description": "ID of the analyst.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "firm_id",
"type": "str",
"description": "ID of the analyst firm.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "smart_score",
"type": "float",
"description": "A weighted average of the total_ratings_percentile, overall_avg_return_percentile, and overall_success_rate",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "overall_success_rate",
"type": "float",
"description": "The percentage (normalized) of gain/loss ratings that resulted in a gain overall.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "overall_avg_return_percentile",
"type": "float",
"description": "The percentile (normalized) of this analyst's overall average return per rating in comparison to other analysts' overall average returns per rating.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "total_ratings_percentile",
"type": "float",
"description": "The percentile (normalized) of this analyst's total number of ratings in comparison to the total number of ratings published by all other analysts",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "total_ratings",
"type": "int",
"description": "Number of recommendations made by this analyst.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "overall_gain_count",
"type": "int",
"description": "The number of ratings that have gained value since the date of recommendation",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "overall_loss_count",
"type": "int",
"description": "The number of ratings that have lost value since the date of recommendation",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "overall_average_return",
"type": "float",
"description": "The average percent (normalized) price difference per rating since the date of recommendation",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "overall_std_dev",
"type": "float",
"description": "The standard deviation in percent (normalized) price difference in the analyst's ratings since the date of recommendation",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "gain_count_1m",
"type": "int",
"description": "The number of ratings that have gained value over the last month",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "loss_count_1m",
"type": "int",
"description": "The number of ratings that have lost value over the last month",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "average_return_1m",
"type": "float",
"description": "The average percent (normalized) price difference per rating over the last month",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "std_dev_1m",
"type": "float",
"description": "The standard deviation in percent (normalized) price difference in the analyst's ratings over the last month",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "smart_score_1m",
"type": "float",
"description": "A weighted average smart score over the last month.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "success_rate_1m",
"type": "float",
"description": "The percentage (normalized) of gain/loss ratings that resulted in a gain over the last month",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "gain_count_3m",
"type": "int",
"description": "The number of ratings that have gained value over the last 3 months",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "loss_count_3m",
"type": "int",
"description": "The number of ratings that have lost value over the last 3 months",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "average_return_3m",
"type": "float",
"description": "The average percent (normalized) price difference per rating over the last 3 months",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "std_dev_3m",
"type": "float",
"description": "The standard deviation in percent (normalized) price difference in the analyst's ratings over the last 3 months",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "smart_score_3m",
"type": "float",
"description": "A weighted average smart score over the last 3 months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "success_rate_3m",
"type": "float",
"description": "The percentage (normalized) of gain/loss ratings that resulted in a gain over the last 3 months",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "gain_count_6m",
"type": "int",
"description": "The number of ratings that have gained value over the last 6 months",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "loss_count_6m",
"type": "int",
"description": "The number of ratings that have lost value over the last 6 months",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "average_return_6m",
"type": "float",
"description": "The average percent (normalized) price difference per rating over the last 6 months",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "std_dev_6m",
"type": "float",
"description": "The standard deviation in percent (normalized) price difference in the analyst's ratings over the last 6 months",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "gain_count_9m",
"type": "int",
"description": "The number of ratings that have gained value over the last 9 months",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "loss_count_9m",
"type": "int",
"description": "The number of ratings that have lost value over the last 9 months",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "average_return_9m",
"type": "float",
"description": "The average percent (normalized) price difference per rating over the last 9 months",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "std_dev_9m",
"type": "float",
"description": "The standard deviation in percent (normalized) price difference in the analyst's ratings over the last 9 months",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "smart_score_9m",
"type": "float",
"description": "A weighted average smart score over the last 9 months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "success_rate_9m",
"type": "float",
"description": "The percentage (normalized) of gain/loss ratings that resulted in a gain over the last 9 months",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "gain_count_1y",
"type": "int",
"description": "The number of ratings that have gained value over the last 1 year",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "loss_count_1y",
"type": "int",
"description": "The number of ratings that have lost value over the last 1 year",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "average_return_1y",
"type": "float",
"description": "The average percent (normalized) price difference per rating over the last 1 year",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "std_dev_1y",
"type": "float",
"description": "The standard deviation in percent (normalized) price difference in the analyst's ratings over the last 1 year",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "smart_score_1y",
"type": "float",
"description": "A weighted average smart score over the last 1 year.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "success_rate_1y",
"type": "float",
"description": "The percentage (normalized) of gain/loss ratings that resulted in a gain over the last 1 year",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "gain_count_2y",
"type": "int",
"description": "The number of ratings that have gained value over the last 2 years",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "loss_count_2y",
"type": "int",
"description": "The number of ratings that have lost value over the last 2 years",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "average_return_2y",
"type": "float",
"description": "The average percent (normalized) price difference per rating over the last 2 years",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "std_dev_2y",
"type": "float",
"description": "The standard deviation in percent (normalized) price difference in the analyst's ratings over the last 2 years",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "smart_score_2y",
"type": "float",
"description": "A weighted average smart score over the last 3 years.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "success_rate_2y",
"type": "float",
"description": "The percentage (normalized) of gain/loss ratings that resulted in a gain over the last 2 years",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "gain_count_3y",
"type": "int",
"description": "The number of ratings that have gained value over the last 3 years",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "loss_count_3y",
"type": "int",
"description": "The number of ratings that have lost value over the last 3 years",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "average_return_3y",
"type": "float",
"description": "The average percent (normalized) price difference per rating over the last 3 years",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "std_dev_3y",
"type": "float",
"description": "The standard deviation in percent (normalized) price difference in the analyst's ratings over the last 3 years",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "smart_score_3y",
"type": "float",
"description": "A weighted average smart score over the last 3 years.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "success_rate_3y",
"type": "float",
"description": "The percentage (normalized) of gain/loss ratings that resulted in a gain over the last 3 years",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -6276,7 +7144,8 @@
"type": "Union[str, List[str]]",
"description": "Symbol to get data for. Multiple items allowed for provider(s): intrinio.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -6292,28 +7161,32 @@
"type": "int",
"description": "The future fiscal year to retrieve estimates for. When no symbol and year is supplied the current calendar year is used.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "fiscal_period",
"type": "Literal['fy', 'q1', 'q2', 'q3', 'q4']",
"description": "The future fiscal period to retrieve estimates for.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "calendar_year",
"type": "int",
"description": "The future calendar year to retrieve estimates for. When no symbol and year is supplied the current calendar year is used.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "calendar_period",
"type": "Literal['q1', 'q2', 'q3', 'q4']",
"description": "The future calendar period to retrieve estimates for.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -6353,91 +7226,104 @@
"type": "str",
"description": "Symbol representing the entity requested in the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "name",
"type": "str",
"description": "Name of the entity.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "date",
"type": "date",
"description": "The date of the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "fiscal_year",
"type": "int",
"description": "Fiscal year for the estimate.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "fiscal_period",
"type": "str",
"description": "Fiscal quarter for the estimate.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "calendar_year",
"type": "int",
"description": "Calendar year for the estimate.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "calendar_period",
"type": "str",
"description": "Calendar quarter for the estimate.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "low_estimate",
"type": "int",
"description": "The sales estimate low for the period.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "high_estimate",
"type": "int",
"description": "The sales estimate high for the period.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "mean",
"type": "int",
"description": "The sales estimate mean for the period.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "median",
"type": "int",
"description": "The sales estimate median for the period.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "standard_deviation",
"type": "int",
"description": "The sales estimate standard deviation for the period.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "number_of_analysts",
"type": "int",
"description": "Number of analysts providing estimates for the period.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"intrinio": [
@@ -6446,63 +7332,72 @@
"type": "int",
"description": "Number of revisions up in the last week.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "revisions_1w_down",
"type": "int",
"description": "Number of revisions down in the last week.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "revisions_1w_change_percent",
"type": "float",
"description": "The analyst revisions percent change in estimate for the period of 1 week.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "revisions_1m_up",
"type": "int",
"description": "Number of revisions up in the last month.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "revisions_1m_down",
"type": "int",
"description": "Number of revisions down in the last month.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "revisions_1m_change_percent",
"type": "float",
"description": "The analyst revisions percent change in estimate for the period of 1 month.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "revisions_3m_up",
"type": "int",
"description": "Number of revisions up in the last 3 months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "revisions_3m_down",
"type": "int",
"description": "Number of revisions down in the last 3 months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "revisions_3m_change_percent",
"type": "float",
"description": "The analyst revisions percent change in estimate for the period of 3 months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -6522,7 +7417,8 @@
"type": "Union[str, List[str]]",
"description": "Symbol to get data for. Multiple items allowed for provider(s): fmp, intrinio.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -6538,21 +7434,24 @@
"type": "Literal['annual', 'quarter']",
"description": "The future fiscal period to retrieve estimates for.",
"default": "annual",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "limit",
"type": "int",
"description": "The number of data entries to return.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "include_historical",
"type": "bool",
"description": "If True, the data will include all past data and the limit will be ignored.",
"default": false,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"intrinio": [
@@ -6561,28 +7460,32 @@
"type": "int",
"description": "The future fiscal year to retrieve estimates for. When no symbol and year is supplied the current calendar year is used.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "fiscal_period",
"type": "Literal['fy', 'q1', 'q2', 'q3', 'q4']",
"description": "The future fiscal period to retrieve estimates for.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "calendar_year",
"type": "int",
"description": "The future calendar year to retrieve estimates for. When no symbol and year is supplied the current calendar year is used.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "calendar_period",
"type": "Literal['q1', 'q2', 'q3', 'q4']",
"description": "The future calendar period to retrieve estimates for.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -6622,91 +7525,104 @@
"type": "str",
"description": "Symbol representing the entity requested in the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "name",
"type": "str",
"description": "Name of the entity.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "date",
"type": "date",
"description": "The date of the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "fiscal_year",
"type": "int",
"description": "Fiscal year for the estimate.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "fiscal_period",
"type": "str",
"description": "Fiscal quarter for the estimate.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "calendar_year",
"type": "int",
"description": "Calendar year for the estimate.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "calendar_period",
"type": "str",
"description": "Calendar quarter for the estimate.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "low_estimate",
"type": "float",
"description": "Estimated EPS low for the period.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "high_estimate",
"type": "float",
"description": "Estimated EPS high for the period.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "mean",
"type": "float",
"description": "Estimated EPS mean for the period.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "median",
"type": "float",
"description": "Estimated EPS median for the period.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "standard_deviation",
"type": "float",
"description": "Estimated EPS standard deviation for the period.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "number_of_analysts",
"type": "int",
"description": "Number of analysts providing estimates for the period.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"fmp": [],
@@ -6716,35 +7632,40 @@
"type": "float",
"description": "The earnings per share (EPS) percent change in estimate for the period.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "mean_1w",
"type": "float",
"description": "The mean estimate for the period one week ago.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "mean_1m",
"type": "float",
"description": "The mean estimate for the period one month ago.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "mean_2m",
"type": "float",
"description": "The mean estimate for the period two months ago.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "mean_3m",
"type": "float",
"description": "The mean estimate for the period three months ago.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -6764,7 +7685,8 @@
"type": "Union[str, List[str]]",
"description": "Symbol to get data for. Multiple items allowed for provider(s): intrinio.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -6812,49 +7734,56 @@
"type": "str",
"description": "Symbol representing the entity requested in the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "name",
"type": "str",
"description": "Name of the entity.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "year1",
"type": "float",
"description": "Estimated PE ratio for the next fiscal year.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "year2",
"type": "float",
"description": "Estimated PE ratio two fiscal years from now.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "year3",
"type": "float",
"description": "Estimated PE ratio three fiscal years from now.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "year4",
"type": "float",
"description": "Estimated PE ratio four fiscal years from now.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "year5",
"type": "float",
"description": "Estimated PE ratio five fiscal years from now.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"intrinio": [
@@ -6863,21 +7792,24 @@
"type": "float",
"description": "Estimated Forward PEG ratio for the next fiscal year.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "eps_ttm",
"type": "float",
"description": "The latest trailing twelve months earnings per share.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "last_udpated",
"type": "date",
"description": "The date the data was last updated.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -6897,7 +7829,8 @@
"type": "Literal['asc', 'desc']",
"description": "Sort order. Possible values: 'asc', 'desc'. Default: 'desc'.",
"default": "desc",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -6945,42 +7878,48 @@
"type": "str",
"description": "Symbol representing the entity requested in the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "name",
"type": "str",
"description": "Name of the entity.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "price",
"type": "float",
"description": "Last price.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "change",
"type": "float",
"description": "Change in price value.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "percent_change",
"type": "float",
"description": "Percent change.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "volume",
"type": "float",
"description": "The trading volume.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
],
"yfinance": [
@@ -6989,21 +7928,24 @@
"type": "float",
"description": "Market Cap.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "avg_volume_3_months",
"type": "float",
"description": "Average volume over the last 3 months in millions.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "pe_ratio_ttm",
"type": "float",
"description": "PE Ratio (TTM).",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -7023,7 +7965,8 @@
"type": "Literal['asc', 'desc']",
"description": "Sort order. Possible values: 'asc', 'desc'. Default: 'desc'.",
"default": "desc",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -7071,42 +8014,48 @@
"type": "str",
"description": "Symbol representing the entity requested in the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "name",
"type": "str",
"description": "Name of the entity.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "price",
"type": "float",
"description": "Last price.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "change",
"type": "float",
"description": "Change in price value.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "percent_change",
"type": "float",
"description": "Percent change.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "volume",
"type": "float",
"description": "The trading volume.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
],
"yfinance": [
@@ -7115,21 +8064,24 @@
"type": "float",
"description": "Market Cap.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "avg_volume_3_months",
"type": "float",
"description": "Average volume over the last 3 months in millions.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "pe_ratio_ttm",
"type": "float",
"description": "PE Ratio (TTM).",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -7149,7 +8101,8 @@
"type": "Literal['asc', 'desc']",
"description": "Sort order. Possible values: 'asc', 'desc'. Default: 'desc'.",
"default": "desc",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -7197,42 +8150,48 @@
"type": "str",
"description": "Symbol representing the entity requested in the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "name",
"type": "str",
"description": "Name of the entity.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "price",
"type": "float",
"description": "Last price.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "change",
"type": "float",
"description": "Change in price value.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "percent_change",
"type": "float",
"description": "Percent change.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "volume",
"type": "float",
"description": "The trading volume.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
],
"yfinance": [
@@ -7241,21 +8200,24 @@
"type": "float",
"description": "Market Cap displayed in billions.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "avg_volume_3_months",
"type": "float",
"description": "Average volume over the last 3 months in millions.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "pe_ratio_ttm",
"type": "float",
"description": "PE Ratio (TTM).",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -7275,7 +8237,8 @@
"type": "Literal['asc', 'desc']",
"description": "Sort order. Possible values: 'asc', 'desc'. Default: 'desc'.",
"default": "desc",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -7323,42 +8286,48 @@
"type": "str",
"description": "Symbol representing the entity requested in the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "name",
"type": "str",
"description": "Name of the entity.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "price",
"type": "float",
"description": "Last price.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "change",
"type": "float",
"description": "Change in price value.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "percent_change",
"type": "float",
"description": "Percent change.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "volume",
"type": "float",
"description": "The trading volume.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
],
"yfinance": [
@@ -7367,21 +8336,24 @@
"type": "float",
"description": "Market Cap.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "avg_volume_3_months",
"type": "float",
"description": "Average volume over the last 3 months in millions.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "pe_ratio_ttm",
"type": "float",
"description": "PE Ratio (TTM).",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -7401,7 +8373,8 @@
"type": "Literal['asc', 'desc']",
"description": "Sort order. Possible values: 'asc', 'desc'. Default: 'desc'.",
"default": "desc",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -7449,42 +8422,48 @@
"type": "str",
"description": "Symbol representing the entity requested in the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "name",
"type": "str",
"description": "Name of the entity.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "price",
"type": "float",
"description": "Last price.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "change",
"type": "float",
"description": "Change in price value.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "percent_change",
"type": "float",
"description": "Percent change.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "volume",
"type": "float",
"description": "The trading volume.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
],
"yfinance": [
@@ -7493,21 +8472,24 @@
"type": "float",
"description": "Market Cap.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "avg_volume_3_months",
"type": "float",
"description": "Average volume over the last 3 months in millions.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "pe_ratio_ttm",
"type": "float",
"description": "PE Ratio (TTM).",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -7527,7 +8509,8 @@
"type": "Literal['asc', 'desc']",
"description": "Sort order. Possible values: 'asc', 'desc'. Default: 'desc'.",
"default": "desc",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -7575,42 +8558,48 @@
"type": "str",
"description": "Symbol representing the entity requested in the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "name",
"type": "str",
"description": "Name of the entity.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "price",
"type": "float",
"description": "Last price.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "change",
"type": "float",
"description": "Change in price value.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "percent_change",
"type": "float",
"description": "Percent change.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "volume",
"type": "float",
"description": "The trading volume.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
],
"yfinance": [
@@ -7619,21 +8608,24 @@
"type": "float",
"description": "Market Cap.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "avg_volume_3_months",
"type": "float",
"description": "Average volume over the last 3 months in millions.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "pe_ratio_ttm",
"type": "float",
"description": "PE Ratio (TTM).",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -7653,7 +8645,8 @@
"type": "Literal['asc', 'desc']",
"description": "Sort order. Possible values: 'asc', 'desc'. Default: 'desc'.",
"default": "desc",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -7701,42 +8694,48 @@
"type": "str",
"description": "Symbol representing the entity requested in the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "name",
"type": "str",
"description": "Name of the entity.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "price",
"type": "float",
"description": "Last price.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "change",
"type": "float",
"description": "Change in price value.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "percent_change",
"type": "float",
"description": "Percent change.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "volume",
"type": "float",
"description": "The trading volume.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
],
"yfinance": [
@@ -7745,21 +8744,24 @@
"type": "float",
"description": "Market Cap.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "avg_volume_3_months",
"type": "float",
"description": "Average volume over the last 3 months in millions.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "pe_ratio_ttm",
"type": "float",
"description": "PE Ratio (TTM).",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -7779,28 +8781,32 @@
"type": "Union[date, str]",
"description": "Start date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "end_date",
"type": "Union[date, str]",
"description": "End date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "form_type",
"type": "str",
"description": "Filter by form type. Visit https://www.sec.gov/forms for a list of supported form types.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "limit",
"type": "int",
"description": "The number of data entries to return.",
"default": 100,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -7816,7 +8822,8 @@
"type": "bool",
"description": "Flag for whether or not the filing is done.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -7856,42 +8863,48 @@
"type": "str",
"description": "Symbol representing the entity requested in the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "cik",
"type": "str",
"description": "Central Index Key (CIK) for the requested entity.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "title",
"type": "str",
"description": "Title of the filing.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "date",
"type": "datetime",
"description": "The date of the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "form_type",
"type": "str",
"description": "The form type of the filing",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "link",
"type": "str",
"description": "URL to the filing page on the SEC site.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
],
"fmp": []
@@ -7912,7 +8925,8 @@
"type": "Union[str, List[str]]",
"description": "Symbol to get data for. Multiple items allowed for provider(s): fmp.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "provider",
@@ -7960,427 +8974,488 @@
"type": "str",
"description": "Symbol representing the entity requested in the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "revenue_per_share_ttm",
"type": "float",
"description": "Revenue per share calculated as trailing twelve months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "net_income_per_share_ttm",
"type": "float",
"description": "Net income per share calculated as trailing twelve months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "operating_cash_flow_per_share_ttm",
"type": "float",
"description": "Operating cash flow per share calculated as trailing twelve months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "free_cash_flow_per_share_ttm",
"type": "float",
"description": "Free cash flow per share calculated as trailing twelve months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "cash_per_share_ttm",
"type": "float",
"description": "Cash per share calculated as trailing twelve months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "book_value_per_share_ttm",
"type": "float",
"description": "Book value per share calculated as trailing twelve months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "tangible_book_value_per_share_ttm",
"type": "float",
"description": "Tangible book value per share calculated as trailing twelve months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "shareholders_equity_per_share_ttm",
"type": "float",
"description": "Shareholders equity per share calculated as trailing twelve months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "interest_debt_per_share_ttm",
"type": "float",
"description": "Interest debt per share calculated as trailing twelve months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "market_cap_ttm",
"type": "float",
"description": "Market capitalization calculated as trailing twelve months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "enterprise_value_ttm",
"type": "float",
"description": "Enterprise value calculated as trailing twelve months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "pe_ratio_ttm",
"type": "float",
"description": "Price-to-earnings ratio (P/E ratio) calculated as trailing twelve months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "price_to_sales_ratio_ttm",
"type": "float",
"description": "Price-to-sales ratio calculated as trailing twelve months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "pocf_ratio_ttm",
"type": "float",
"description": "Price-to-operating cash flow ratio calculated as trailing twelve months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "pfcf_ratio_ttm",
"type": "float",
"description": "Price-to-free cash flow ratio calculated as trailing twelve months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "pb_ratio_ttm",
"type": "float",
"description": "Price-to-book ratio calculated as trailing twelve months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "ptb_ratio_ttm",
"type": "float",
"description": "Price-to-tangible book ratio calculated as trailing twelve months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "ev_to_sales_ttm",
"type": "float",
"description": "Enterprise value-to-sales ratio calculated as trailing twelve months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "enterprise_value_over_ebitda_ttm",
"type": "float",
"description": "Enterprise value-to-EBITDA ratio calculated as trailing twelve months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "ev_to_operating_cash_flow_ttm",
"type": "float",
"description": "Enterprise value-to-operating cash flow ratio calculated as trailing twelve months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "ev_to_free_cash_flow_ttm",
"type": "float",
"description": "Enterprise value-to-free cash flow ratio calculated as trailing twelve months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "earnings_yield_ttm",
"type": "float",
"description": "Earnings yield calculated as trailing twelve months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "free_cash_flow_yield_ttm",
"type": "float",
"description": "Free cash flow yield calculated as trailing twelve months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "debt_to_equity_ttm",
"type": "float",
"description": "Debt-to-equity ratio calculated as trailing twelve months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "debt_to_assets_ttm",
"type": "float",
"description": "Debt-to-assets ratio calculated as trailing twelve months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "net_debt_to_ebitda_ttm",
"type": "float",
"description": "Net debt-to-EBITDA ratio calculated as trailing twelve months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "current_ratio_ttm",
"type": "float",
"description": "Current ratio calculated as trailing twelve months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "interest_coverage_ttm",
"type": "float",
"description": "Interest coverage calculated as trailing twelve months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "income_quality_ttm",
"type": "float",
"description": "Income quality calculated as trailing twelve months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "dividend_yield_ttm",
"type": "float",
"description": "Dividend yield calculated as trailing twelve months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "dividend_yield_percentage_ttm",
"type": "float",
"description": "Dividend yield percentage calculated as trailing twelve months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "dividend_to_market_cap_ttm",
"type": "float",
"description": "Dividend to market capitalization ratio calculated as trailing twelve months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "dividend_per_share_ttm",
"type": "float",
"description": "Dividend per share calculated as trailing twelve months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "payout_ratio_ttm",
"type": "float",
"description": "Payout ratio calculated as trailing twelve months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "sales_general_and_administrative_to_revenue_ttm",
"type": "float",
"description": "Sales general and administrative expenses-to-revenue ratio calculated as trailing twelve months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "research_and_development_to_revenue_ttm",
"type": "float",
"description": "Research and development expenses-to-revenue ratio calculated as trailing twelve months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "intangibles_to_total_assets_ttm",
"type": "float",
"description": "Intangibles-to-total assets ratio calculated as trailing twelve months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "capex_to_operating_cash_flow_ttm",
"type": "float",
"description": "Capital expenditures-to-operating cash flow ratio calculated as trailing twelve months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "capex_to_revenue_ttm",
"type": "float",
"description": "Capital expenditures-to-revenue ratio calculated as trailing twelve months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "capex_to_depreciation_ttm",
"type": "float",
"description": "Capital expenditures-to-depreciation ratio calculated as trailing twelve months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "stock_based_compensation_to_revenue_ttm",
"type": "float",
"description": "Stock-based compensation-to-revenue ratio calculated as trailing twelve months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "graham_number_ttm",
"type": "float",
"description": "Graham number calculated as trailing twelve months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "roic_ttm",
"type": "float",
"description": "Return on invested capital calculated as trailing twelve months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "return_on_tangible_assets_ttm",
"type": "float",
"description": "Return on tangible assets calculated as trailing twelve months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "graham_net_net_ttm",
"type": "float",
"description": "Graham net-net working capital calculated as trailing twelve months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "working_capital_ttm",
"type": "float",
"description": "Working capital calculated as trailing twelve months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "tangible_asset_value_ttm",
"type": "float",
"description": "Tangible asset value calculated as trailing twelve months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "net_current_asset_value_ttm",
"type": "float",
"description": "Net current asset value calculated as trailing twelve months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "invested_capital_ttm",
"type": "float",
"description": "Invested capital calculated as trailing twelve months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "average_receivables_ttm",
"type": "float",
"description": "Average receivables calculated as trailing twelve months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "average_payables_ttm",
"type": "float",
"description": "Average payables calculated as trailing twelve months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "average_inventory_ttm",
"type": "float",
"description": "Average inventory calculated as trailing twelve months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "days_sales_outstanding_ttm",
"type": "float",
"description": "Days sales outstanding calculated as trailing twelve months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "days_payables_outstanding_ttm",
"type": "float",
"description": "Days payables outstanding calculated as trailing twelve months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "days_of_inventory_on_hand_ttm",
"type": "float",
"description": "Days of inventory on hand calculated as trailing twelve months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "receivables_turnover_ttm",
"type": "float",
"description": "Receivables turnover calculated as trailing twelve months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "payables_turnover_ttm",
"type": "float",
"description": "Payables turnover calculated as trailing twelve months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "inventory_turnover_ttm",
"type": "float",
"description": "Inventory turnover calculated as trailing twelve months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "roe_ttm",
"type": "float",
"description": "Return on equity calculated as trailing twelve months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "capex_per_share_ttm",
"type": "float",
"description": "Capital expenditures per share calculated as trailing twelve months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"fmp": []
@@ -8401,21 +9476,24 @@
"type": "str",
"description": "Symbol to get data for.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "period",
"type": "str",
"description": "Time period of the data to return.",
"default": "annual",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "limit",
"type": "Annotated[int, Ge(ge=0)]",
"description": "The number of data entries to return.",
"default": 5,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -8431,7 +9509,8 @@
"type": "Literal['annual', 'quarter']",
"description": "None",
"default": "annual",
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"intrinio": [
@@ -8440,14 +9519,16 @@
"type": "Literal['annual', 'quarter']",
"description": "None",
"default": "annual",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "fiscal_year",
"type": "int",
"description": "The specific fiscal year. Reports do not go beyond 2008.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"polygon": [
@@ -8456,98 +9537,112 @@
"type": "Literal['annual', 'quarter', 'ttm']",
"description": "None",
"default": "annual",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "filing_date",
"type": "date",
"description": "Filing date of the financial statement.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "filing_date_lt",
"type": "date",
"description": "Filing date less than the given date.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "filing_date_lte",
"type": "date",
"description": "Filing date less than or equal to the given date.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "filing_date_gt",
"type": "date",
"description": "Filing date greater than the given date.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "filing_date_gte",
"type": "date",
"description": "Filing date greater than or equal to the given date.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "period_of_report_date",
"type": "date",
"description": "Period of report date of the financial statement.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "period_of_report_date_lt",
"type": "date",
"description": "Period of report date less than the given date.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "period_of_report_date_lte",
"type": "date",
"description": "Period of report date less than or equal to the given date.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "period_of_report_date_gt",
"type": "date",
"description": "Period of report date greater than the given date.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "period_of_report_date_gte",
"type": "date",
"description": "Period of report date greater than or equal to the given date.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "include_sources",
"type": "bool",
"description": "Whether to include the sources of the financial statement.",
"default": true,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "order",
"type": "Literal['asc', 'desc']",
"description": "Order of the financial statement.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "sort",
"type": "Literal['filing_date', 'period_of_report_date']",
"description": "Sort of the financial statement.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"yfinance": [
@@ -8556,7 +9651,8 @@
"type": "Literal['annual', 'quarter']",
"description": "None",
"default": "annual",
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -8596,21 +9692,24 @@
"type": "date",
"description": "The end date of the reporting period.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "fiscal_period",
"type": "str",
"description": "The fiscal period of the report.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "fiscal_year",
"type": "int",
"description": "The fiscal year of the fiscal period.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"fmp": [
@@ -8619,350 +9718,400 @@
"type": "date",
"description": "The date when the filing was made.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "accepted_date",
"type": "datetime",
"description": "The date and time when the filing was accepted.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "reported_currency",
"type": "str",
"description": "The currency in which the balance sheet was reported.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "cash_and_cash_equivalents",
"type": "float",
"description": "Cash and cash equivalents.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "short_term_investments",
"type": "float",
"description": "Short term investments.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "cash_and_short_term_investments",
"type": "float",
"description": "Cash and short term investments.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "net_receivables",
"type": "float",
"description": "Net receivables.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "inventory",
"type": "float",
"description": "Inventory.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "other_current_assets",
"type": "float",
"description": "Other current assets.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "total_current_assets",
"type": "float",
"description": "Total current assets.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "plant_property_equipment_net",
"type": "float",
"description": "Plant property equipment net.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "goodwill",
"type": "float",
"description": "Goodwill.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "intangible_assets",
"type": "float",
"description": "Intangible assets.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "goodwill_and_intangible_assets",
"type": "float",
"description": "Goodwill and intangible assets.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "long_term_investments",
"type": "float",
"description": "Long term investments.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "tax_assets",
"type": "float",
"description": "Tax assets.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "other_non_current_assets",
"type": "float",
"description": "Other non current assets.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "non_current_assets",
"type": "float",
"description": "Total non current assets.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "other_assets",
"type": "float",
"description": "Other assets.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "total_assets",
"type": "float",
"description": "Total assets.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "accounts_payable",
"type": "float",
"description": "Accounts payable.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "short_term_debt",
"type": "float",
"description": "Short term debt.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "tax_payables",
"type": "float",
"description": "Tax payables.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "current_deferred_revenue",
"type": "float",
"description": "Current deferred revenue.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "other_current_liabilities",
"type": "float",
"description": "Other current liabilities.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "total_current_liabilities",
"type": "float",
"description": "Total current liabilities.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "long_term_debt",
"type": "float",
"description": "Long term debt.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "deferred_revenue_non_current",
"type": "float",
"description": "Non current deferred revenue.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "deferred_tax_liabilities_non_current",
"type": "float",
"description": "Deferred tax liabilities non current.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "other_non_current_liabilities",
"type": "float",
"description": "Other non current liabilities.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "total_non_current_liabilities",
"type": "float",
"description": "Total non current liabilities.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "other_liabilities",
"type": "float",
"description": "Other liabilities.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "capital_lease_obligations",
"type": "float",
"description": "Capital lease obligations.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "total_liabilities",
"type": "float",
"description": "Total liabilities.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "preferred_stock",
"type": "float",
"description": "Preferred stock.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "common_stock",
"type": "float",
"description": "Common stock.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "retained_earnings",
"type": "float",
"description": "Retained earnings.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "accumulated_other_comprehensive_income",
"type": "float",
"description": "Accumulated other comprehensive income (loss).",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "other_shareholders_equity",
"type": "float",
"description": "Other shareholders equity.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "other_total_shareholders_equity",
"type": "float",
"description": "Other total shareholders equity.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "total_common_equity",
"type": "float",
"description": "Total common equity.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "total_equity_non_controlling_interests",
"type": "float",
"description": "Total equity non controlling interests.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "total_liabilities_and_shareholders_equity",
"type": "float",
"description": "Total liabilities and shareholders equity.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "minority_interest",
"type": "float",
"description": "Minority interest.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "total_liabilities_and_total_equity",
"type": "float",
"description": "Total liabilities and total equity.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "total_investments",
"type": "float",
"description": "Total investments.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "total_debt",
"type": "float",
"description": "Total debt.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "net_debt",
"type": "float",
"description": "Net debt.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "link",
"type": "str",
"description": "Link to the filing.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "final_link",
"type": "str",
"description": "Link to the filing document.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"intrinio": [
@@ -8971,630 +10120,720 @@
"type": "str",
"description": "The currency in which the balance sheet is reported.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "cash_and_cash_equivalents",
"type": "float",
"description": "Cash and cash equivalents.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "cash_and_due_from_banks",
"type": "float",
"description": "Cash and due from banks.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "restricted_cash",
"type": "float",
"description": "Restricted cash.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "short_term_investments",
"type": "float",
"description": "Short term investments.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "federal_funds_sold",
"type": "float",
"description": "Federal funds sold.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "accounts_receivable",
"type": "float",
"description": "Accounts receivable.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "note_and_lease_receivable",
"type": "float",
"description": "Note and lease receivable. (Vendor non-trade receivables)",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "inventories",
"type": "float",
"description": "Net Inventories.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "customer_and_other_receivables",
"type": "float",
"description": "Customer and other receivables.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "interest_bearing_deposits_at_other_banks",
"type": "float",
"description": "Interest bearing deposits at other banks.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "time_deposits_placed_and_other_short_term_investments",
"type": "float",
"description": "Time deposits placed and other short term investments.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "trading_account_securities",
"type": "float",
"description": "Trading account securities.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "loans_and_leases",
"type": "float",
"description": "Loans and leases.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "allowance_for_loan_and_lease_losses",
"type": "float",
"description": "Allowance for loan and lease losses.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "current_deferred_refundable_income_taxes",
"type": "float",
"description": "Current deferred refundable income taxes.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "other_current_assets",
"type": "float",
"description": "Other current assets.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "loans_and_leases_net_of_allowance",
"type": "float",
"description": "Loans and leases net of allowance.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "accrued_investment_income",
"type": "float",
"description": "Accrued investment income.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "other_current_non_operating_assets",
"type": "float",
"description": "Other current non-operating assets.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "loans_held_for_sale",
"type": "float",
"description": "Loans held for sale.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "prepaid_expenses",
"type": "float",
"description": "Prepaid expenses.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "total_current_assets",
"type": "float",
"description": "Total current assets.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "plant_property_equipment_gross",
"type": "float",
"description": "Plant property equipment gross.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "accumulated_depreciation",
"type": "float",
"description": "Accumulated depreciation.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "premises_and_equipment_net",
"type": "float",
"description": "Net premises and equipment.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "plant_property_equipment_net",
"type": "float",
"description": "Net plant property equipment.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "long_term_investments",
"type": "float",
"description": "Long term investments.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "mortgage_servicing_rights",
"type": "float",
"description": "Mortgage servicing rights.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "unearned_premiums_asset",
"type": "float",
"description": "Unearned premiums asset.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "non_current_note_lease_receivables",
"type": "float",
"description": "Non-current note lease receivables.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "deferred_acquisition_cost",
"type": "float",
"description": "Deferred acquisition cost.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "goodwill",
"type": "float",
"description": "Goodwill.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "separate_account_business_assets",
"type": "float",
"description": "Separate account business assets.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "non_current_deferred_refundable_income_taxes",
"type": "float",
"description": "Noncurrent deferred refundable income taxes.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "intangible_assets",
"type": "float",
"description": "Intangible assets.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "employee_benefit_assets",
"type": "float",
"description": "Employee benefit assets.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "other_assets",
"type": "float",
"description": "Other assets.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "other_non_current_operating_assets",
"type": "float",
"description": "Other noncurrent operating assets.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "other_non_current_non_operating_assets",
"type": "float",
"description": "Other noncurrent non-operating assets.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "interest_bearing_deposits",
"type": "float",
"description": "Interest bearing deposits.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "total_non_current_assets",
"type": "float",
"description": "Total noncurrent assets.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "total_assets",
"type": "float",
"description": "Total assets.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "non_interest_bearing_deposits",
"type": "float",
"description": "Non interest bearing deposits.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "federal_funds_purchased_and_securities_sold",
"type": "float",
"description": "Federal funds purchased and securities sold.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "bankers_acceptance_outstanding",
"type": "float",
"description": "Bankers acceptance outstanding.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "short_term_debt",
"type": "float",
"description": "Short term debt.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "accounts_payable",
"type": "float",
"description": "Accounts payable.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "current_deferred_revenue",
"type": "float",
"description": "Current deferred revenue.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "current_deferred_payable_income_tax_liabilities",
"type": "float",
"description": "Current deferred payable income tax liabilities.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "accrued_interest_payable",
"type": "float",
"description": "Accrued interest payable.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "accrued_expenses",
"type": "float",
"description": "Accrued expenses.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "other_short_term_payables",
"type": "float",
"description": "Other short term payables.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "customer_deposits",
"type": "float",
"description": "Customer deposits.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "dividends_payable",
"type": "float",
"description": "Dividends payable.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "claims_and_claim_expense",
"type": "float",
"description": "Claims and claim expense.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "future_policy_benefits",
"type": "float",
"description": "Future policy benefits.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "current_employee_benefit_liabilities",
"type": "float",
"description": "Current employee benefit liabilities.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "unearned_premiums_liability",
"type": "float",
"description": "Unearned premiums liability.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "other_taxes_payable",
"type": "float",
"description": "Other taxes payable.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "policy_holder_funds",
"type": "float",
"description": "Policy holder funds.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "other_current_liabilities",
"type": "float",
"description": "Other current liabilities.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "other_current_non_operating_liabilities",
"type": "float",
"description": "Other current non-operating liabilities.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "separate_account_business_liabilities",
"type": "float",
"description": "Separate account business liabilities.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "total_current_liabilities",
"type": "float",
"description": "Total current liabilities.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "long_term_debt",
"type": "float",
"description": "Long term debt.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "other_long_term_liabilities",
"type": "float",
"description": "Other long term liabilities.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "non_current_deferred_revenue",
"type": "float",
"description": "Non-current deferred revenue.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "non_current_deferred_payable_income_tax_liabilities",
"type": "float",
"description": "Non-current deferred payable income tax liabilities.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "non_current_employee_benefit_liabilities",
"type": "float",
"description": "Non-current employee benefit liabilities.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "other_non_current_operating_liabilities",
"type": "float",
"description": "Other non-current operating liabilities.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "other_non_current_non_operating_liabilities",
"type": "float",
"description": "Other non-current, non-operating liabilities.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "total_non_current_liabilities",
"type": "float",
"description": "Total non-current liabilities.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "capital_lease_obligations",
"type": "float",
"description": "Capital lease obligations.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "asset_retirement_reserve_litigation_obligation",
"type": "float",
"description": "Asset retirement reserve litigation obligation.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "total_liabilities",
"type": "float",
"description": "Total liabilities.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "commitments_contingencies",
"type": "float",
"description": "Commitments contingencies.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "redeemable_non_controlling_interest",
"type": "float",
"description": "Redeemable non-controlling interest.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "preferred_stock",
"type": "float",
"description": "Preferred stock.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "common_stock",
"type": "float",
"description": "Common stock.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "retained_earnings",
"type": "float",
"description": "Retained earnings.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "treasury_stock",
"type": "float",
"description": "Treasury stock.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "accumulated_other_comprehensive_income",
"type": "float",
"description": "Accumulated other comprehensive income.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "participating_policy_holder_equity",
"type": "float",
"description": "Participating policy holder equity.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "other_equity_adjustments",
"type": "float",
"description": "Other equity adjustments.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "total_common_equity",
"type": "float",
"description": "Total common equity.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "total_preferred_common_equity",
"type": "float",
"description": "Total preferred common equity.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "non_controlling_interest",
"type": "float",
"description": "Non-controlling interest.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "total_equity_non_controlling_interests",
"type": "float",
"description": "Total equity non-controlling interests.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "total_liabilities_shareholders_equity",
"type": "float",
"description": "Total liabilities and shareholders equity.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"polygon": [
@@ -9603,203 +10842,232 @@
"type": "int",
"description": "Accounts receivable",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "marketable_securities",
"type": "int",
"description": "Marketable securities",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "prepaid_expenses",
"type": "int",
"description": "Prepaid expenses",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "other_current_assets",
"type": "int",
"description": "Other current assets",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "total_current_assets",
"type": "int",
"description": "Total current assets",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "property_plant_equipment_net",
"type": "int",
"description": "Property plant and equipment net",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "inventory",
"type": "int",
"description": "Inventory",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "other_non_current_assets",
"type": "int",
"description": "Other non-current assets",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "total_non_current_assets",
"type": "int",
"description": "Total non-current assets",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "intangible_assets",
"type": "int",
"description": "Intangible assets",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "total_assets",
"type": "int",
"description": "Total assets",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "accounts_payable",
"type": "int",
"description": "Accounts payable",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "employee_wages",
"type": "int",
"description": "Employee wages",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "other_current_liabilities",
"type": "int",
"description": "Other current liabilities",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "total_current_liabilities",
"type": "int",
"description": "Total current liabilities",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "other_non_current_liabilities",
"type": "int",
"description": "Other non-current liabilities",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "total_non_current_liabilities",
"type": "int",
"description": "Total non-current liabilities",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "long_term_debt",
"type": "int",
"description": "Long term debt",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "total_liabilities",
"type": "int",
"description": "Total liabilities",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "minority_interest",
"type": "int",
"description": "Minority interest",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "temporary_equity_attributable_to_parent",
"type": "int",
"description": "Temporary equity attributable to parent",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "equity_attributable_to_parent",
"type": "int",
"description": "Equity attributable to parent",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "temporary_equity",
"type": "int",
"description": "Temporary equity",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "preferred_stock",
"type": "int",
"description": "Preferred stock",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "redeemable_non_controlling_interest",
"type": "int",
"description": "Redeemable non-controlling interest",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "redeemable_non_controlling_interest_other",
"type": "int",
"description": "Redeemable non-controlling interest other",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "total_stock_holders_equity",
"type": "int",
"description": "Total stock holders equity",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "total_liabilities_and_stock_holders_equity",
"type": "int",
"description": "Total liabilities and stockholders equity",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "total_equity",
"type": "int",
"description": "Total equity",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"yfinance": []
@@ -9820,14 +11088,16 @@
"type": "str",
"description": "Symbol to get data for.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "limit",
"type": "int",
"description": "The number of data entries to return.",
"default": 10,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -9875,294 +11145,336 @@
"type": "str",
"description": "Symbol representing the entity requested in the data.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "date",
"type": "date",
"description": "The date of the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "period",
"type": "str",
"description": "Reporting period.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_cash_and_cash_equivalents",
"type": "float",
"description": "Growth rate of cash and cash equivalents.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_short_term_investments",
"type": "float",
"description": "Growth rate of short-term investments.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_cash_and_short_term_investments",
"type": "float",
"description": "Growth rate of cash and short-term investments.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_net_receivables",
"type": "float",
"description": "Growth rate of net receivables.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_inventory",
"type": "float",
"description": "Growth rate of inventory.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_other_current_assets",
"type": "float",
"description": "Growth rate of other current assets.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_total_current_assets",
"type": "float",
"description": "Growth rate of total current assets.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_property_plant_equipment_net",
"type": "float",
"description": "Growth rate of net property, plant, and equipment.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_goodwill",
"type": "float",
"description": "Growth rate of goodwill.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_intangible_assets",
"type": "float",
"description": "Growth rate of intangible assets.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_goodwill_and_intangible_assets",
"type": "float",
"description": "Growth rate of goodwill and intangible assets.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_long_term_investments",
"type": "float",
"description": "Growth rate of long-term investments.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_tax_assets",
"type": "float",
"description": "Growth rate of tax assets.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_other_non_current_assets",
"type": "float",
"description": "Growth rate of other non-current assets.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_total_non_current_assets",
"type": "float",
"description": "Growth rate of total non-current assets.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_other_assets",
"type": "float",
"description": "Growth rate of other assets.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_total_assets",
"type": "float",
"description": "Growth rate of total assets.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_account_payables",
"type": "float",
"description": "Growth rate of accounts payable.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_short_term_debt",
"type": "float",
"description": "Growth rate of short-term debt.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_tax_payables",
"type": "float",
"description": "Growth rate of tax payables.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_deferred_revenue",
"type": "float",
"description": "Growth rate of deferred revenue.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_other_current_liabilities",
"type": "float",
"description": "Growth rate of other current liabilities.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_total_current_liabilities",
"type": "float",
"description": "Growth rate of total current liabilities.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_long_term_debt",
"type": "float",
"description": "Growth rate of long-term debt.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_deferred_revenue_non_current",
"type": "float",
"description": "Growth rate of non-current deferred revenue.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_deferrred_tax_liabilities_non_current",
"type": "float",
"description": "Growth rate of non-current deferred tax liabilities.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_other_non_current_liabilities",
"type": "float",
"description": "Growth rate of other non-current liabilities.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_total_non_current_liabilities",
"type": "float",
"description": "Growth rate of total non-current liabilities.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_other_liabilities",
"type": "float",
"description": "Growth rate of other liabilities.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_total_liabilities",
"type": "float",
"description": "Growth rate of total liabilities.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_common_stock",
"type": "float",
"description": "Growth rate of common stock.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_retained_earnings",
"type": "float",
"description": "Growth rate of retained earnings.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_accumulated_other_comprehensive_income_loss",
"type": "float",
"description": "Growth rate of accumulated other comprehensive income/loss.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_othertotal_stockholders_equity",
"type": "float",
"description": "Growth rate of other total stockholders' equity.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_total_stockholders_equity",
"type": "float",
"description": "Growth rate of total stockholders' equity.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_total_liabilities_and_stockholders_equity",
"type": "float",
"description": "Growth rate of total liabilities and stockholders' equity.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_total_investments",
"type": "float",
"description": "Growth rate of total investments.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_total_debt",
"type": "float",
"description": "Growth rate of total debt.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_net_debt",
"type": "float",
"description": "Growth rate of net debt.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
],
"fmp": []
@@ -10183,21 +11495,24 @@
"type": "str",
"description": "Symbol to get data for.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "period",
"type": "str",
"description": "Time period of the data to return.",
"default": "annual",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "limit",
"type": "Annotated[int, Ge(ge=0)]",
"description": "The number of data entries to return.",
"default": 5,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -10213,7 +11528,8 @@
"type": "Literal['annual', 'quarter']",
"description": "None",
"default": "annual",
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"intrinio": [
@@ -10222,14 +11538,16 @@
"type": "Literal['annual', 'quarter', 'ttm', 'ytd']",
"description": "None",
"default": "annual",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "fiscal_year",
"type": "int",
"description": "The specific fiscal year. Reports do not go beyond 2008.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"polygon": [
@@ -10238,98 +11556,112 @@
"type": "Literal['annual', 'quarter']",
"description": "None",
"default": "annual",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "filing_date",
"type": "date",
"description": "Filing date of the financial statement.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "filing_date_lt",
"type": "date",
"description": "Filing date less than the given date.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "filing_date_lte",
"type": "date",
"description": "Filing date less than or equal to the given date.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "filing_date_gt",
"type": "date",
"description": "Filing date greater than the given date.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "filing_date_gte",
"type": "date",
"description": "Filing date greater than or equal to the given date.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "period_of_report_date",
"type": "date",
"description": "Period of report date of the financial statement.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "period_of_report_date_lt",
"type": "date",
"description": "Period of report date less than the given date.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "period_of_report_date_lte",
"type": "date",
"description": "Period of report date less than or equal to the given date.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "period_of_report_date_gt",
"type": "date",
"description": "Period of report date greater than the given date.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "period_of_report_date_gte",
"type": "date",
"description": "Period of report date greater than or equal to the given date.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "include_sources",
"type": "bool",
"description": "Whether to include the sources of the financial statement.",
"default": false,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "order",
"type": "Literal['asc', 'desc']",
"description": "Order of the financial statement.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "sort",
"type": "Literal['filing_date', 'period_of_report_date']",
"description": "Sort of the financial statement.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"yfinance": [
@@ -10338,7 +11670,8 @@
"type": "Literal['annual', 'quarter']",
"description": "None",
"default": "annual",
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -10378,21 +11711,24 @@
"type": "date",
"description": "The end date of the reporting period.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "fiscal_period",
"type": "str",
"description": "The fiscal period of the report.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "fiscal_year",
"type": "int",
"description": "The fiscal year of the fiscal period.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"fmp": [
@@ -10401,252 +11737,288 @@
"type": "int",
"description": "The fiscal year of the fiscal period.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "filing_date",
"type": "date",
"description": "The date of the filing.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "accepted_date",
"type": "datetime",
"description": "The date the filing was accepted.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "reported_currency",
"type": "str",
"description": "The currency in which the cash flow statement was reported.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "net_income",
"type": "float",
"description": "Net income.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "depreciation_and_amortization",
"type": "float",
"description": "Depreciation and amortization.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "deferred_income_tax",
"type": "float",
"description": "Deferred income tax.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "stock_based_compensation",
"type": "float",
"description": "Stock-based compensation.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "change_in_working_capital",
"type": "float",
"description": "Change in working capital.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "change_in_account_receivables",
"type": "float",
"description": "Change in account receivables.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "change_in_inventory",
"type": "float",
"description": "Change in inventory.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "change_in_account_payable",
"type": "float",
"description": "Change in account payable.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "change_in_other_working_capital",
"type": "float",
"description": "Change in other working capital.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "change_in_other_non_cash_items",
"type": "float",
"description": "Change in other non-cash items.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "net_cash_from_operating_activities",
"type": "float",
"description": "Net cash from operating activities.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "purchase_of_property_plant_and_equipment",
"type": "float",
"description": "Purchase of property, plant and equipment.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "acquisitions",
"type": "float",
"description": "Acquisitions.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "purchase_of_investment_securities",
"type": "float",
"description": "Purchase of investment securities.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "sale_and_maturity_of_investments",
"type": "float",
"description": "Sale and maturity of investments.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "other_investing_activities",
"type": "float",
"description": "Other investing activities.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "net_cash_from_investing_activities",
"type": "float",
"description": "Net cash from investing activities.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "repayment_of_debt",
"type": "float",
"description": "Repayment of debt.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "issuance_of_common_equity",
"type": "float",
"description": "Issuance of common equity.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "repurchase_of_common_equity",
"type": "float",
"description": "Repurchase of common equity.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "payment_of_dividends",
"type": "float",
"description": "Payment of dividends.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "other_financing_activities",
"type": "float",
"description": "Other financing activities.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "net_cash_from_financing_activities",
"type": "float",
"description": "Net cash from financing activities.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "effect_of_exchange_rate_changes_on_cash",
"type": "float",
"description": "Effect of exchange rate changes on cash.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "net_change_in_cash_and_equivalents",
"type": "float",
"description": "Net change in cash and equivalents.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "cash_at_beginning_of_period",
"type": "float",
"description": "Cash at beginning of period.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "cash_at_end_of_period",
"type": "float",
"description": "Cash at end of period.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "operating_cash_flow",
"type": "float",
"description": "Operating cash flow.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "capital_expenditure",
"type": "float",
"description": "Capital expenditure.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "free_cash_flow",
"type": "float",
"description": "None",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "link",
"type": "str",
"description": "Link to the filing.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "final_link",
"type": "str",
"description": "Link to the filing document.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"intrinio": [
@@ -10655,315 +12027,360 @@
"type": "str",
"description": "The currency in which the balance sheet is reported.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "net_income_continuing_operations",
"type": "float",
"description": "Net Income (Continuing Operations)",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "net_income_discontinued_operations",
"type": "float",
"description": "Net Income (Discontinued Operations)",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "net_income",
"type": "float",
"description": "Consolidated Net Income.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provision_for_loan_losses",
"type": "float",
"description": "Provision for Loan Losses",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provision_for_credit_losses",
"type": "float",
"description": "Provision for credit losses",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "depreciation_expense",
"type": "float",
"description": "Depreciation Expense.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "amortization_expense",
"type": "float",
"description": "Amortization Expense.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "share_based_compensation",
"type": "float",
"description": "Share-based compensation.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "non_cash_adjustments_to_reconcile_net_income",
"type": "float",
"description": "Non-Cash Adjustments to Reconcile Net Income.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "changes_in_operating_assets_and_liabilities",
"type": "float",
"description": "Changes in Operating Assets and Liabilities (Net)",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "net_cash_from_continuing_operating_activities",
"type": "float",
"description": "Net Cash from Continuing Operating Activities",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "net_cash_from_discontinued_operating_activities",
"type": "float",
"description": "Net Cash from Discontinued Operating Activities",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "net_cash_from_operating_activities",
"type": "float",
"description": "Net Cash from Operating Activities",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "divestitures",
"type": "float",
"description": "Divestitures",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "sale_of_property_plant_and_equipment",
"type": "float",
"description": "Sale of Property, Plant, and Equipment",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "acquisitions",
"type": "float",
"description": "Acquisitions",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "purchase_of_investments",
"type": "float",
"description": "Purchase of Investments",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "purchase_of_investment_securities",
"type": "float",
"description": "Purchase of Investment Securities",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "sale_and_maturity_of_investments",
"type": "float",
"description": "Sale and Maturity of Investments",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "loans_held_for_sale",
"type": "float",
"description": "Loans Held for Sale (Net)",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "purchase_of_property_plant_and_equipment",
"type": "float",
"description": "Purchase of Property, Plant, and Equipment",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "other_investing_activities",
"type": "float",
"description": "Other Investing Activities (Net)",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "net_cash_from_continuing_investing_activities",
"type": "float",
"description": "Net Cash from Continuing Investing Activities",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "net_cash_from_discontinued_investing_activities",
"type": "float",
"description": "Net Cash from Discontinued Investing Activities",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "net_cash_from_investing_activities",
"type": "float",
"description": "Net Cash from Investing Activities",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "payment_of_dividends",
"type": "float",
"description": "Payment of Dividends",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "repurchase_of_common_equity",
"type": "float",
"description": "Repurchase of Common Equity",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "repurchase_of_preferred_equity",
"type": "float",
"description": "Repurchase of Preferred Equity",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "issuance_of_common_equity",
"type": "float",
"description": "Issuance of Common Equity",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "issuance_of_preferred_equity",
"type": "float",
"description": "Issuance of Preferred Equity",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "issuance_of_debt",
"type": "float",
"description": "Issuance of Debt",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "repayment_of_debt",
"type": "float",
"description": "Repayment of Debt",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "other_financing_activities",
"type": "float",
"description": "Other Financing Activities (Net)",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "cash_interest_received",
"type": "float",
"description": "Cash Interest Received",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "net_change_in_deposits",
"type": "float",
"description": "Net Change in Deposits",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "net_increase_in_fed_funds_sold",
"type": "float",
"description": "Net Increase in Fed Funds Sold",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "net_cash_from_continuing_financing_activities",
"type": "float",
"description": "Net Cash from Continuing Financing Activities",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "net_cash_from_discontinued_financing_activities",
"type": "float",
"description": "Net Cash from Discontinued Financing Activities",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "net_cash_from_financing_activities",
"type": "float",
"description": "Net Cash from Financing Activities",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "effect_of_exchange_rate_changes",
"type": "float",
"description": "Effect of Exchange Rate Changes",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "other_net_changes_in_cash",
"type": "float",
"description": "Other Net Changes in Cash",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "net_change_in_cash_and_equivalents",
"type": "float",
"description": "Net Change in Cash and Equivalents",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "cash_income_taxes_paid",
"type": "float",
"description": "Cash Income Taxes Paid",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "cash_interest_paid",
"type": "float",
"description": "Cash Interest Paid",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"polygon": [
@@ -10972,91 +12389,104 @@
"type": "int",
"description": "Net cash flow from operating activities continuing.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "net_cash_flow_from_operating_activities_discontinued",
"type": "int",
"description": "Net cash flow from operating activities discontinued.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "net_cash_flow_from_operating_activities",
"type": "int",
"description": "Net cash flow from operating activities.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "net_cash_flow_from_investing_activities_continuing",
"type": "int",
"description": "Net cash flow from investing activities continuing.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "net_cash_flow_from_investing_activities_discontinued",
"type": "int",
"description": "Net cash flow from investing activities discontinued.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "net_cash_flow_from_investing_activities",
"type": "int",
"description": "Net cash flow from investing activities.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "net_cash_flow_from_financing_activities_continuing",
"type": "int",
"description": "Net cash flow from financing activities continuing.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "net_cash_flow_from_financing_activities_discontinued",
"type": "int",
"description": "Net cash flow from financing activities discontinued.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "net_cash_flow_from_financing_activities",
"type": "int",
"description": "Net cash flow from financing activities.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "net_cash_flow_continuing",
"type": "int",
"description": "Net cash flow continuing.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "net_cash_flow_discontinued",
"type": "int",
"description": "Net cash flow discontinued.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "exchange_gains_losses",
"type": "int",
"description": "Exchange gains losses.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "net_cash_flow",
"type": "int",
"description": "Net cash flow.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"yfinance": []
@@ -11077,28 +12507,32 @@
"type": "str",
"description": "Symbol to get data for.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "period",
"type": "str",
"description": "Time period of the data to return.",
"default": "annual",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "statement_type",
"type": "str",
"description": "The type of financial statement - i.e, balance, income, cash.",
"default": "balance",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "limit",
"type": "int",
"description": "The number of data entries to return. Although the response object contains multiple results, because of the variance in the fields, year-to-year and quarter-to-quarter, it is recommended to view results in small chunks.",
"default": 100,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -11114,21 +12548,24 @@
"type": "Literal['annual', 'quarter']",
"description": "None",
"default": "annual",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "statement_type",
"type": "Literal['balance', 'income', 'cash']",
"description": "Cash flow statements are reported as YTD, Q4 is the same as FY.",
"default": "income",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "fiscal_year",
"type": "int",
"description": "The specific fiscal year. Reports do not go beyond 2008.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -11168,21 +12605,24 @@
"type": "date",
"description": "The ending date of the reporting period.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "fiscal_period",
"type": "str",
"description": "The fiscal period of the report (e.g. FY, Q1, etc.).",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "fiscal_year",
"type": "int",
"description": "The fiscal year of the fiscal period.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"intrinio": []
@@ -11203,14 +12643,16 @@
"type": "str",
"description": "Symbol to get data for.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "limit",
"type": "int",
"description": "The number of data entries to return.",
"default": 10,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -11258,231 +12700,264 @@
"type": "str",
"description": "Symbol representing the entity requested in the data.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "date",
"type": "date",
"description": "The date of the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "period",
"type": "str",
"description": "Period the statement is returned for.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_net_income",
"type": "float",
"description": "Growth rate of net income.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_depreciation_and_amortization",
"type": "float",
"description": "Growth rate of depreciation and amortization.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_deferred_income_tax",
"type": "float",
"description": "Growth rate of deferred income tax.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_stock_based_compensation",
"type": "float",
"description": "Growth rate of stock-based compensation.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_change_in_working_capital",
"type": "float",
"description": "Growth rate of change in working capital.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_accounts_receivables",
"type": "float",
"description": "Growth rate of accounts receivables.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_inventory",
"type": "float",
"description": "Growth rate of inventory.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_accounts_payables",
"type": "float",
"description": "Growth rate of accounts payables.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_other_working_capital",
"type": "float",
"description": "Growth rate of other working capital.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_other_non_cash_items",
"type": "float",
"description": "Growth rate of other non-cash items.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_net_cash_provided_by_operating_activities",
"type": "float",
"description": "Growth rate of net cash provided by operating activities.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_investments_in_property_plant_and_equipment",
"type": "float",
"description": "Growth rate of investments in property, plant, and equipment.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_acquisitions_net",
"type": "float",
"description": "Growth rate of net acquisitions.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_purchases_of_investments",
"type": "float",
"description": "Growth rate of purchases of investments.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_sales_maturities_of_investments",
"type": "float",
"description": "Growth rate of sales maturities of investments.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_other_investing_activities",
"type": "float",
"description": "Growth rate of other investing activities.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_net_cash_used_for_investing_activities",
"type": "float",
"description": "Growth rate of net cash used for investing activities.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_debt_repayment",
"type": "float",
"description": "Growth rate of debt repayment.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_common_stock_issued",
"type": "float",
"description": "Growth rate of common stock issued.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_common_stock_repurchased",
"type": "float",
"description": "Growth rate of common stock repurchased.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_dividends_paid",
"type": "float",
"description": "Growth rate of dividends paid.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_other_financing_activities",
"type": "float",
"description": "Growth rate of other financing activities.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_net_cash_used_provided_by_financing_activities",
"type": "float",
"description": "Growth rate of net cash used/provided by financing activities.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_effect_of_forex_changes_on_cash",
"type": "float",
"description": "Growth rate of the effect of foreign exchange changes on cash.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_net_change_in_cash",
"type": "float",
"description": "Growth rate of net change in cash.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_cash_at_end_of_period",
"type": "float",
"description": "Growth rate of cash at the end of the period.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_cash_at_beginning_of_period",
"type": "float",
"description": "Growth rate of cash at the beginning of the period.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_operating_cash_flow",
"type": "float",
"description": "Growth rate of operating cash flow.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_capital_expenditure",
"type": "float",
"description": "Growth rate of capital expenditure.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_free_cash_flow",
"type": "float",
"description": "Growth rate of free cash flow.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
],
"fmp": []
@@ -11503,21 +12978,24 @@
"type": "str",
"description": "Symbol to get data for.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "start_date",
"type": "Union[date, str]",
"description": "Start date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "end_date",
"type": "Union[date, str]",
"description": "End date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -11534,7 +13012,8 @@
"type": "int",
"description": "The number of data entries to return.",
"default": 100,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"yfinance": []
@@ -11575,14 +13054,16 @@
"type": "date",
"description": "The ex-dividend date - the date on which the stock begins trading without rights to the dividend.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "amount",
"type": "float",
"description": "The dividend amount per share.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
],
"fmp": [
@@ -11591,35 +13072,40 @@
"type": "str",
"description": "Label of the historical dividends.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "adj_dividend",
"type": "float",
"description": "Adjusted dividend of the historical dividends.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "record_date",
"type": "date",
"description": "Record date of the historical dividends.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "payment_date",
"type": "date",
"description": "Payment date of the historical dividends.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "declaration_date",
"type": "date",
"description": "Declaration date of the historical dividends.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"intrinio": [
@@ -11628,21 +13114,24 @@
"type": "float",
"description": "factor by which to multiply stock prices before this date, in order to calculate historically-adjusted stock prices.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "currency",
"type": "str",
"description": "The currency in which the dividend is paid.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "split_ratio",
"type": "float",
"description": "The ratio of the stock split, if a stock split occurred.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"yfinance": []
@@ -11663,7 +13152,8 @@
"type": "str",
"description": "Symbol to get data for.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "provider",
@@ -11679,7 +13169,8 @@
"type": "int",
"description": "The number of data entries to return.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -11719,35 +13210,40 @@
"type": "date",
"description": "The date of the data.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "symbol",
"type": "str",
"description": "Symbol representing the entity requested in the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "announce_time",
"type": "str",
"description": "Timing of the earnings announcement.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "eps_actual",
"type": "float",
"description": "Actual EPS from the earnings date.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "eps_estimated",
"type": "float",
"description": "Estimated EPS for the earnings date.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"fmp": [
@@ -11756,35 +13252,40 @@
"type": "float",
"description": "Estimated consensus revenue for the reporting period.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "revenue_actual",
"type": "float",
"description": "The actual reported revenue.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "reporting_time",
"type": "str",
"description": "The reporting time - e.g. after market close.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "updated_at",
"type": "date",
"description": "The date when the data was last updated.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "period_ending",
"type": "date",
"description": "The fiscal period end date.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -11804,7 +13305,8 @@
"type": "str",
"description": "Symbol to get data for.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "provider",
@@ -11852,63 +13354,72 @@
"type": "str",
"description": "Symbol representing the entity requested in the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "cik",
"type": "int",
"description": "Central Index Key (CIK) for the requested entity.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "acceptance_time",
"type": "datetime",
"description": "Time of acceptance of the company employee.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "period_of_report",
"type": "date",
"description": "Date of reporting of the company employee.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "company_name",
"type": "str",
"description": "Registered name of the company to retrieve the historical employees of.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "form_type",
"type": "str",
"description": "Form type of the company employee.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "filing_date",
"type": "date",
"description": "Filing date of the company employee",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "employee_count",
"type": "int",
"description": "Count of employees of the company.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "source",
"type": "str",
"description": "Source URL which retrieves this data for the company.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
],
"fmp": []
@@ -11929,14 +13440,16 @@
"type": "str",
"description": "Query to search for.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "limit",
"type": "int",
"description": "The number of data entries to return.",
"default": 1000,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -11984,77 +13497,88 @@
"type": "str",
"description": "ID of the financial attribute.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "name",
"type": "str",
"description": "Name of the financial attribute.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "tag",
"type": "str",
"description": "Tag of the financial attribute.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "statement_code",
"type": "str",
"description": "Code of the financial statement.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "statement_type",
"type": "str",
"description": "Type of the financial statement.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "parent_name",
"type": "str",
"description": "Parent's name of the financial attribute.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "sequence",
"type": "int",
"description": "Sequence of the financial statement.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "factor",
"type": "str",
"description": "Unit of the financial attribute.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "transaction",
"type": "str",
"description": "Transaction type (credit/debit) of the financial attribute.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "type",
"type": "str",
"description": "Type of the financial attribute.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "unit",
"type": "str",
"description": "Unit of the financial attribute.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"intrinio": []
@@ -12075,14 +13599,16 @@
"type": "Union[str, List[str]]",
"description": "Symbol to get data for. Multiple items allowed for provider(s): intrinio.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "tag",
"type": "Union[str, List[str]]",
"description": "Intrinio data tag ID or code. Multiple items allowed for provider(s): intrinio.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "provider",
@@ -12130,21 +13656,24 @@
"type": "str",
"description": "Symbol representing the entity requested in the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "tag",
"type": "str",
"description": "Tag name for the fetched data.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "value",
"type": "Union[str, float]",
"description": "The value of the data.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"intrinio": []
@@ -12165,56 +13694,64 @@
"type": "Union[str, List[str]]",
"description": "Symbol to get data for. Multiple items allowed for provider(s): intrinio.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "tag",
"type": "Union[str, List[str]]",
"description": "Intrinio data tag ID or code. Multiple items allowed for provider(s): intrinio.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "start_date",
"type": "Union[date, str]",
"description": "Start date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "end_date",
"type": "Union[date, str]",
"description": "End date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "frequency",
"type": "Literal['daily', 'weekly', 'monthly', 'quarterly', 'yearly']",
"description": "The frequency of the data.",
"default": "yearly",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "limit",
"type": "int",
"description": "The number of data entries to return.",
"default": 1000,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "tag_type",
"type": "str",
"description": "Filter by type, when applicable.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "sort",
"type": "Literal['asc', 'desc']",
"description": "Sort order.",
"default": "desc",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -12262,28 +13799,32 @@
"type": "date",
"description": "The date of the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "symbol",
"type": "str",
"description": "Symbol representing the entity requested in the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "tag",
"type": "str",
"description": "Tag name for the fetched data.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "value",
"type": "float",
"description": "The value of the data.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"intrinio": []
@@ -12304,21 +13845,24 @@
"type": "str",
"description": "Symbol to get data for.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "period",
"type": "str",
"description": "Time period of the data to return.",
"default": "annual",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "limit",
"type": "Annotated[int, Ge(ge=0)]",
"description": "The number of data entries to return.",
"default": 5,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -12334,7 +13878,8 @@
"type": "Literal['annual', 'quarter']",
"description": "None",
"default": "annual",
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"intrinio": [
@@ -12343,14 +13888,16 @@
"type": "Literal['annual', 'quarter', 'ttm', 'ytd']",
"description": "None",
"default": "annual",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "fiscal_year",
"type": "int",
"description": "The specific fiscal year. Reports do not go beyond 2008.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"polygon": [
@@ -12359,98 +13906,112 @@
"type": "Literal['annual', 'quarter', 'ttm']",
"description": "None",
"default": "annual",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "filing_date",
"type": "date",
"description": "Filing date of the financial statement.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "filing_date_lt",
"type": "date",
"description": "Filing date less than the given date.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "filing_date_lte",
"type": "date",
"description": "Filing date less than or equal to the given date.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "filing_date_gt",
"type": "date",
"description": "Filing date greater than the given date.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "filing_date_gte",
"type": "date",
"description": "Filing date greater than or equal to the given date.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "period_of_report_date",
"type": "date",
"description": "Period of report date of the financial statement.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "period_of_report_date_lt",
"type": "date",
"description": "Period of report date less than the given date.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "period_of_report_date_lte",
"type": "date",
"description": "Period of report date less than or equal to the given date.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "period_of_report_date_gt",
"type": "date",
"description": "Period of report date greater than the given date.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "period_of_report_date_gte",
"type": "date",
"description": "Period of report date greater than or equal to the given date.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "include_sources",
"type": "bool",
"description": "Whether to include the sources of the financial statement.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "order",
"type": "Literal['asc', 'desc']",
"description": "Order of the financial statement.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "sort",
"type": "Literal['filing_date', 'period_of_report_date']",
"description": "Sort of the financial statement.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"yfinance": [
@@ -12459,7 +14020,8 @@
"type": "Literal['annual', 'quarter']",
"description": "None",
"default": "annual",
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -12499,21 +14061,24 @@
"type": "date",
"description": "The end date of the reporting period.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "fiscal_period",
"type": "str",
"description": "The fiscal period of the report.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "fiscal_year",
"type": "int",
"description": "The fiscal year of the fiscal period.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"fmp": [
@@ -12522,231 +14087,264 @@
"type": "date",
"description": "The date when the filing was made.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "accepted_date",
"type": "datetime",
"description": "The date and time when the filing was accepted.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "reported_currency",
"type": "str",
"description": "The currency in which the balance sheet was reported.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "revenue",
"type": "float",
"description": "Total revenue.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "cost_of_revenue",
"type": "float",
"description": "Cost of revenue.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "gross_profit",
"type": "float",
"description": "Gross profit.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "gross_profit_margin",
"type": "float",
"description": "Gross profit margin.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "general_and_admin_expense",
"type": "float",
"description": "General and administrative expenses.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "research_and_development_expense",
"type": "float",
"description": "Research and development expenses.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "selling_and_marketing_expense",
"type": "float",
"description": "Selling and marketing expenses.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "selling_general_and_admin_expense",
"type": "float",
"description": "Selling, general and administrative expenses.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "other_expenses",
"type": "float",
"description": "Other expenses.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "total_operating_expenses",
"type": "float",
"description": "Total operating expenses.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "cost_and_expenses",
"type": "float",
"description": "Cost and expenses.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "interest_income",
"type": "float",
"description": "Interest income.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "total_interest_expense",
"type": "float",
"description": "Total interest expenses.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "depreciation_and_amortization",
"type": "float",
"description": "Depreciation and amortization.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "ebitda",
"type": "float",
"description": "EBITDA.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "ebitda_margin",
"type": "float",
"description": "EBITDA margin.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "total_operating_income",
"type": "float",
"description": "Total operating income.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "operating_income_margin",
"type": "float",
"description": "Operating income margin.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "total_other_income_expenses",
"type": "float",
"description": "Total other income and expenses.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "total_pre_tax_income",
"type": "float",
"description": "Total pre-tax income.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "pre_tax_income_margin",
"type": "float",
"description": "Pre-tax income margin.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "income_tax_expense",
"type": "float",
"description": "Income tax expense.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "consolidated_net_income",
"type": "float",
"description": "Consolidated net income.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "net_income_margin",
"type": "float",
"description": "Net income margin.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "basic_earnings_per_share",
"type": "float",
"description": "Basic earnings per share.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "diluted_earnings_per_share",
"type": "float",
"description": "Diluted earnings per share.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "weighted_average_basic_shares_outstanding",
"type": "float",
"description": "Weighted average basic shares outstanding.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "weighted_average_diluted_shares_outstanding",
"type": "float",
"description": "Weighted average diluted shares outstanding.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "link",
"type": "str",
"description": "Link to the filing.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "final_link",
"type": "str",
"description": "Link to the filing document.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"intrinio": [
@@ -12755,553 +14353,632 @@
"type": "str",
"description": "The currency in which the balance sheet is reported.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "revenue",
"type": "float",
"description": "Total revenue",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "operating_revenue",
"type": "float",
"description": "Total operating revenue",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "cost_of_revenue",
"type": "float",
"description": "Total cost of revenue",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "operating_cost_of_revenue",
"type": "float",
"description": "Total operating cost of revenue",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "gross_profit",
"type": "float",
"description": "Total gross profit",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "gross_profit_margin",
"type": "float",
"description": "Gross margin ratio.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provision_for_credit_losses",
"type": "float",
"description": "Provision for credit losses",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "research_and_development_expense",
"type": "float",
"description": "Research and development expense",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "selling_general_and_admin_expense",
"type": "float",
"description": "Selling, general, and admin expense",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "salaries_and_employee_benefits",
"type": "float",
"description": "Salaries and employee benefits",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "marketing_expense",
"type": "float",
"description": "Marketing expense",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "net_occupancy_and_equipment_expense",
"type": "float",
"description": "Net occupancy and equipment expense",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "other_operating_expenses",
"type": "float",
"description": "Other operating expenses",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "depreciation_expense",
"type": "float",
"description": "Depreciation expense",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "amortization_expense",
"type": "float",
"description": "Amortization expense",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "amortization_of_deferred_policy_acquisition_costs",
"type": "float",
"description": "Amortization of deferred policy acquisition costs",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "exploration_expense",
"type": "float",
"description": "Exploration expense",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "depletion_expense",
"type": "float",
"description": "Depletion expense",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "total_operating_expenses",
"type": "float",
"description": "Total operating expenses",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "total_operating_income",
"type": "float",
"description": "Total operating income",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "deposits_and_money_market_investments_interest_income",
"type": "float",
"description": "Deposits and money market investments interest income",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "federal_funds_sold_and_securities_borrowed_interest_income",
"type": "float",
"description": "Federal funds sold and securities borrowed interest income",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "investment_securities_interest_income",
"type": "float",
"description": "Investment securities interest income",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "loans_and_leases_interest_income",
"type": "float",
"description": "Loans and leases interest income",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "trading_account_interest_income",
"type": "float",
"description": "Trading account interest income",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "other_interest_income",
"type": "float",
"description": "Other interest income",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "total_non_interest_income",
"type": "float",
"description": "Total non-interest income",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "interest_and_investment_income",
"type": "float",
"description": "Interest and investment income",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "short_term_borrowings_interest_expense",
"type": "float",
"description": "Short-term borrowings interest expense",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "long_term_debt_interest_expense",
"type": "float",
"description": "Long-term debt interest expense",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "capitalized_lease_obligations_interest_expense",
"type": "float",
"description": "Capitalized lease obligations interest expense",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "deposits_interest_expense",
"type": "float",
"description": "Deposits interest expense",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "federal_funds_purchased_and_securities_sold_interest_expense",
"type": "float",
"description": "Federal funds purchased and securities sold interest expense",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "other_interest_expense",
"type": "float",
"description": "Other interest expense",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "total_interest_expense",
"type": "float",
"description": "Total interest expense",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "net_interest_income",
"type": "float",
"description": "Net interest income",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "other_non_interest_income",
"type": "float",
"description": "Other non-interest income",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "investment_banking_income",
"type": "float",
"description": "Investment banking income",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "trust_fees_by_commissions",
"type": "float",
"description": "Trust fees by commissions",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "premiums_earned",
"type": "float",
"description": "Premiums earned",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "insurance_policy_acquisition_costs",
"type": "float",
"description": "Insurance policy acquisition costs",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "current_and_future_benefits",
"type": "float",
"description": "Current and future benefits",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "property_and_liability_insurance_claims",
"type": "float",
"description": "Property and liability insurance claims",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "total_non_interest_expense",
"type": "float",
"description": "Total non-interest expense",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "net_realized_and_unrealized_capital_gains_on_investments",
"type": "float",
"description": "Net realized and unrealized capital gains on investments",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "other_gains",
"type": "float",
"description": "Other gains",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "non_operating_income",
"type": "float",
"description": "Non-operating income",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "other_income",
"type": "float",
"description": "Other income",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "other_revenue",
"type": "float",
"description": "Other revenue",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "extraordinary_income",
"type": "float",
"description": "Extraordinary income",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "total_other_income",
"type": "float",
"description": "Total other income",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "ebitda",
"type": "float",
"description": "Earnings Before Interest, Taxes, Depreciation and Amortization.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "ebitda_margin",
"type": "float",
"description": "Margin on Earnings Before Interest, Taxes, Depreciation and Amortization.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "total_pre_tax_income",
"type": "float",
"description": "Total pre-tax income",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "ebit",
"type": "float",
"description": "Earnings Before Interest and Taxes.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "pre_tax_income_margin",
"type": "float",
"description": "Pre-Tax Income Margin.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "income_tax_expense",
"type": "float",
"description": "Income tax expense",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "impairment_charge",
"type": "float",
"description": "Impairment charge",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "restructuring_charge",
"type": "float",
"description": "Restructuring charge",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "service_charges_on_deposit_accounts",
"type": "float",
"description": "Service charges on deposit accounts",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "other_service_charges",
"type": "float",
"description": "Other service charges",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "other_special_charges",
"type": "float",
"description": "Other special charges",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "other_cost_of_revenue",
"type": "float",
"description": "Other cost of revenue",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "net_income_continuing_operations",
"type": "float",
"description": "Net income (continuing operations)",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "net_income_discontinued_operations",
"type": "float",
"description": "Net income (discontinued operations)",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "consolidated_net_income",
"type": "float",
"description": "Consolidated net income",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "other_adjustments_to_consolidated_net_income",
"type": "float",
"description": "Other adjustments to consolidated net income",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "other_adjustment_to_net_income_attributable_to_common_shareholders",
"type": "float",
"description": "Other adjustment to net income attributable to common shareholders",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "net_income_attributable_to_noncontrolling_interest",
"type": "float",
"description": "Net income attributable to noncontrolling interest",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "net_income_attributable_to_common_shareholders",
"type": "float",
"description": "Net income attributable to common shareholders",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "basic_earnings_per_share",
"type": "float",
"description": "Basic earnings per share",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "diluted_earnings_per_share",
"type": "float",
"description": "Diluted earnings per share",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "basic_and_diluted_earnings_per_share",
"type": "float",
"description": "Basic and diluted earnings per share",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "cash_dividends_to_common_per_share",
"type": "float",
"description": "Cash dividends to common per share",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "preferred_stock_dividends_declared",
"type": "float",
"description": "Preferred stock dividends declared",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "weighted_average_basic_shares_outstanding",
"type": "float",
"description": "Weighted average basic shares outstanding",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "weighted_average_diluted_shares_outstanding",
"type": "float",
"description": "Weighted average diluted shares outstanding",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "weighted_average_basic_and_diluted_shares_outstanding",
"type": "float",
"description": "Weighted average basic and diluted shares outstanding",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"polygon": [
@@ -13310,301 +14987,344 @@
"type": "float",
"description": "Total Revenue",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "cost_of_revenue_goods",
"type": "float",
"description": "Cost of Revenue - Goods",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "cost_of_revenue_services",
"type": "float",
"description": "Cost of Revenue - Services",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "cost_of_revenue",
"type": "float",
"description": "Cost of Revenue",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "gross_profit",
"type": "float",
"description": "Gross Profit",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provisions_for_loan_lease_and_other_losses",
"type": "float",
"description": "Provisions for loan lease and other losses",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "depreciation_and_amortization",
"type": "float",
"description": "Depreciation and Amortization",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "income_tax_expense_benefit_current",
"type": "float",
"description": "Income tax expense benefit current",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "deferred_tax_benefit",
"type": "float",
"description": "Deferred tax benefit",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "benefits_costs_expenses",
"type": "float",
"description": "Benefits, costs and expenses",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "selling_general_and_administrative_expense",
"type": "float",
"description": "Selling, general and administrative expense",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "research_and_development",
"type": "float",
"description": "Research and development",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "costs_and_expenses",
"type": "float",
"description": "Costs and expenses",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "other_operating_expenses",
"type": "float",
"description": "Other Operating Expenses",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "operating_expenses",
"type": "float",
"description": "Operating expenses",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "operating_income",
"type": "float",
"description": "Operating Income/Loss",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "non_operating_income",
"type": "float",
"description": "Non Operating Income/Loss",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "interest_and_dividend_income",
"type": "float",
"description": "Interest and Dividend Income",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "total_interest_expense",
"type": "float",
"description": "Interest Expense",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "interest_and_debt_expense",
"type": "float",
"description": "Interest and Debt Expense",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "net_interest_income",
"type": "float",
"description": "Interest Income Net",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "interest_income_after_provision_for_losses",
"type": "float",
"description": "Interest Income After Provision for Losses",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "non_interest_expense",
"type": "float",
"description": "Non-Interest Expense",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "non_interest_income",
"type": "float",
"description": "Non-Interest Income",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "income_from_discontinued_operations_net_of_tax_on_disposal",
"type": "float",
"description": "Income From Discontinued Operations Net of Tax on Disposal",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "income_from_discontinued_operations_net_of_tax",
"type": "float",
"description": "Income From Discontinued Operations Net of Tax",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "income_before_equity_method_investments",
"type": "float",
"description": "Income Before Equity Method Investments",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "income_from_equity_method_investments",
"type": "float",
"description": "Income From Equity Method Investments",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "total_pre_tax_income",
"type": "float",
"description": "Income Before Tax",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "income_tax_expense",
"type": "float",
"description": "Income Tax Expense",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "income_after_tax",
"type": "float",
"description": "Income After Tax",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "consolidated_net_income",
"type": "float",
"description": "Net Income/Loss",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "net_income_attributable_noncontrolling_interest",
"type": "float",
"description": "Net income (loss) attributable to noncontrolling interest",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "net_income_attributable_to_parent",
"type": "float",
"description": "Net income (loss) attributable to parent",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "net_income_attributable_to_common_shareholders",
"type": "float",
"description": "Net Income/Loss Available To Common Stockholders Basic",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "participating_securities_earnings",
"type": "float",
"description": "Participating Securities Distributed And Undistributed Earnings Loss Basic",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "undistributed_earnings_allocated_to_participating_securities",
"type": "float",
"description": "Undistributed Earnings Allocated To Participating Securities",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "common_stock_dividends",
"type": "float",
"description": "Common Stock Dividends",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "preferred_stock_dividends_and_other_adjustments",
"type": "float",
"description": "Preferred stock dividends and other adjustments",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "basic_earnings_per_share",
"type": "float",
"description": "Earnings Per Share",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "diluted_earnings_per_share",
"type": "float",
"description": "Diluted Earnings Per Share",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "weighted_average_basic_shares_outstanding",
"type": "float",
"description": "Basic Average Shares",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "weighted_average_diluted_shares_outstanding",
"type": "float",
"description": "Diluted Average Shares",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"yfinance": []
@@ -13625,21 +15345,24 @@
"type": "str",
"description": "Symbol to get data for.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "limit",
"type": "int",
"description": "The number of data entries to return.",
"default": 10,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "period",
"type": "Literal['annual', 'quarter']",
"description": "Time period of the data to return.",
"default": "annual",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -13687,203 +15410,232 @@
"type": "str",
"description": "Symbol representing the entity requested in the data.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "date",
"type": "date",
"description": "The date of the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "period",
"type": "str",
"description": "Period the statement is returned for.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_revenue",
"type": "float",
"description": "Growth rate of total revenue.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_cost_of_revenue",
"type": "float",
"description": "Growth rate of cost of goods sold.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_gross_profit",
"type": "float",
"description": "Growth rate of gross profit.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_gross_profit_ratio",
"type": "float",
"description": "Growth rate of gross profit as a percentage of revenue.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_research_and_development_expenses",
"type": "float",
"description": "Growth rate of expenses on research and development.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_general_and_administrative_expenses",
"type": "float",
"description": "Growth rate of general and administrative expenses.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_selling_and_marketing_expenses",
"type": "float",
"description": "Growth rate of expenses on selling and marketing activities.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_other_expenses",
"type": "float",
"description": "Growth rate of other operating expenses.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_operating_expenses",
"type": "float",
"description": "Growth rate of total operating expenses.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_cost_and_expenses",
"type": "float",
"description": "Growth rate of total costs and expenses.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_interest_expense",
"type": "float",
"description": "Growth rate of interest expenses.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_depreciation_and_amortization",
"type": "float",
"description": "Growth rate of depreciation and amortization expenses.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_ebitda",
"type": "float",
"description": "Growth rate of Earnings Before Interest, Taxes, Depreciation, and Amortization.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_ebitda_ratio",
"type": "float",
"description": "Growth rate of EBITDA as a percentage of revenue.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_operating_income",
"type": "float",
"description": "Growth rate of operating income.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_operating_income_ratio",
"type": "float",
"description": "Growth rate of operating income as a percentage of revenue.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_total_other_income_expenses_net",
"type": "float",
"description": "Growth rate of net total other income and expenses.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_income_before_tax",
"type": "float",
"description": "Growth rate of income before taxes.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_income_before_tax_ratio",
"type": "float",
"description": "Growth rate of income before taxes as a percentage of revenue.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_income_tax_expense",
"type": "float",
"description": "Growth rate of income tax expenses.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_net_income",
"type": "float",
"description": "Growth rate of net income.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_net_income_ratio",
"type": "float",
"description": "Growth rate of net income as a percentage of revenue.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_eps",
"type": "float",
"description": "Growth rate of Earnings Per Share (EPS).",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_eps_diluted",
"type": "float",
"description": "Growth rate of diluted Earnings Per Share (EPS).",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_weighted_average_shs_out",
"type": "float",
"description": "Growth rate of weighted average shares outstanding.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "growth_weighted_average_shs_out_dil",
"type": "float",
"description": "Growth rate of diluted weighted average shares outstanding.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
],
"fmp": []
@@ -13904,21 +15656,24 @@
"type": "Union[str, List[str]]",
"description": "Symbol to get data for. Multiple items allowed for provider(s): fmp, intrinio, yfinance.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "period",
"type": "Literal['annual', 'quarter']",
"description": "Time period of the data to return.",
"default": "annual",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "limit",
"type": "int",
"description": "The number of data entries to return.",
"default": 100,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -13934,7 +15689,8 @@
"type": "bool",
"description": "Include trailing twelve months (TTM) data.",
"default": false,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"intrinio": [],
@@ -13976,21 +15732,24 @@
"type": "str",
"description": "Symbol representing the entity requested in the data.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "market_cap",
"type": "float",
"description": "Market capitalization",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "pe_ratio",
"type": "float",
"description": "Price-to-earnings ratio (P/E ratio)",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"fmp": [
@@ -13999,406 +15758,464 @@
"type": "date",
"description": "The date of the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "period",
"type": "str",
"description": "Period of the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "calendar_year",
"type": "int",
"description": "Calendar year.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "revenue_per_share",
"type": "float",
"description": "Revenue per share",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "net_income_per_share",
"type": "float",
"description": "Net income per share",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "operating_cash_flow_per_share",
"type": "float",
"description": "Operating cash flow per share",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "free_cash_flow_per_share",
"type": "float",
"description": "Free cash flow per share",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "cash_per_share",
"type": "float",
"description": "Cash per share",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "book_value_per_share",
"type": "float",
"description": "Book value per share",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "tangible_book_value_per_share",
"type": "float",
"description": "Tangible book value per share",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "shareholders_equity_per_share",
"type": "float",
"description": "Shareholders equity per share",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "interest_debt_per_share",
"type": "float",
"description": "Interest debt per share",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "enterprise_value",
"type": "float",
"description": "Enterprise value",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "price_to_sales_ratio",
"type": "float",
"description": "Price-to-sales ratio",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "pocf_ratio",
"type": "float",
"description": "Price-to-operating cash flow ratio",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "pfcf_ratio",
"type": "float",
"description": "Price-to-free cash flow ratio",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "pb_ratio",
"type": "float",
"description": "Price-to-book ratio",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "ptb_ratio",
"type": "float",
"description": "Price-to-tangible book ratio",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "ev_to_sales",
"type": "float",
"description": "Enterprise value-to-sales ratio",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "enterprise_value_over_ebitda",
"type": "float",
"description": "Enterprise value-to-EBITDA ratio",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "ev_to_operating_cash_flow",
"type": "float",
"description": "Enterprise value-to-operating cash flow ratio",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "ev_to_free_cash_flow",
"type": "float",
"description": "Enterprise value-to-free cash flow ratio",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "earnings_yield",
"type": "float",
"description": "Earnings yield",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "free_cash_flow_yield",
"type": "float",
"description": "Free cash flow yield",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "debt_to_equity",
"type": "float",
"description": "Debt-to-equity ratio",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "debt_to_assets",
"type": "float",
"description": "Debt-to-assets ratio",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "net_debt_to_ebitda",
"type": "float",
"description": "Net debt-to-EBITDA ratio",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "current_ratio",
"type": "float",
"description": "Current ratio",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "interest_coverage",
"type": "float",
"description": "Interest coverage",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "income_quality",
"type": "float",
"description": "Income quality",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "dividend_yield",
"type": "float",
"description": "Dividend yield, as a normalized percent.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "payout_ratio",
"type": "float",
"description": "Payout ratio",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "sales_general_and_administrative_to_revenue",
"type": "float",
"description": "Sales general and administrative expenses-to-revenue ratio",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "research_and_development_to_revenue",
"type": "float",
"description": "Research and development expenses-to-revenue ratio",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "intangibles_to_total_assets",
"type": "float",
"description": "Intangibles-to-total assets ratio",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "capex_to_operating_cash_flow",
"type": "float",
"description": "Capital expenditures-to-operating cash flow ratio",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "capex_to_revenue",
"type": "float",
"description": "Capital expenditures-to-revenue ratio",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "capex_to_depreciation",
"type": "float",
"description": "Capital expenditures-to-depreciation ratio",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "stock_based_compensation_to_revenue",
"type": "float",
"description": "Stock-based compensation-to-revenue ratio",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "graham_number",
"type": "float",
"description": "Graham number",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "roic",
"type": "float",
"description": "Return on invested capital",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "return_on_tangible_assets",
"type": "float",
"description": "Return on tangible assets",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "graham_net_net",
"type": "float",
"description": "Graham net-net working capital",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "working_capital",
"type": "float",
"description": "Working capital",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "tangible_asset_value",
"type": "float",
"description": "Tangible asset value",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "net_current_asset_value",
"type": "float",
"description": "Net current asset value",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "invested_capital",
"type": "float",
"description": "Invested capital",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "average_receivables",
"type": "float",
"description": "Average receivables",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "average_payables",
"type": "float",
"description": "Average payables",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "average_inventory",
"type": "float",
"description": "Average inventory",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "days_sales_outstanding",
"type": "float",
"description": "Days sales outstanding",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "days_payables_outstanding",
"type": "float",
"description": "Days payables outstanding",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "days_of_inventory_on_hand",
"type": "float",
"description": "Days of inventory on hand",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "receivables_turnover",
"type": "float",
"description": "Receivables turnover",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "payables_turnover",
"type": "float",
"description": "Payables turnover",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "inventory_turnover",
"type": "float",
"description": "Inventory turnover",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "roe",
"type": "float",
"description": "Return on equity",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "capex_per_share",
"type": "float",
"description": "Capital expenditures per share",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"intrinio": [
@@ -14407,252 +16224,288 @@
"type": "float",
"description": "Price to book ratio.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "price_to_tangible_book",
"type": "float",
"description": "Price to tangible book ratio.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "price_to_revenue",
"type": "float",
"description": "Price to revenue ratio.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "quick_ratio",
"type": "float",
"description": "Quick ratio.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "gross_margin",
"type": "float",
"description": "Gross margin, as a normalized percent.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "ebit_margin",
"type": "float",
"description": "EBIT margin, as a normalized percent.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "profit_margin",
"type": "float",
"description": "Profit margin, as a normalized percent.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "eps",
"type": "float",
"description": "Basic earnings per share.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "eps_growth",
"type": "float",
"description": "EPS growth, as a normalized percent.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "revenue_growth",
"type": "float",
"description": "Revenue growth, as a normalized percent.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "ebitda_growth",
"type": "float",
"description": "EBITDA growth, as a normalized percent.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "ebit_growth",
"type": "float",
"description": "EBIT growth, as a normalized percent.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "net_income_growth",
"type": "float",
"description": "Net income growth, as a normalized percent.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "free_cash_flow_to_firm_growth",
"type": "float",
"description": "Free cash flow to firm growth, as a normalized percent.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "invested_capital_growth",
"type": "float",
"description": "Invested capital growth, as a normalized percent.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "return_on_assets",
"type": "float",
"description": "Return on assets, as a normalized percent.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "return_on_equity",
"type": "float",
"description": "Return on equity, as a normalized percent.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "return_on_invested_capital",
"type": "float",
"description": "Return on invested capital, as a normalized percent.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "ebitda",
"type": "int",
"description": "Earnings before interest, taxes, depreciation, and amortization.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "ebit",
"type": "int",
"description": "Earnings before interest and taxes.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "long_term_debt",
"type": "int",
"description": "Long-term debt.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "total_debt",
"type": "int",
"description": "Total debt.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "total_capital",
"type": "int",
"description": "The sum of long-term debt and total shareholder equity.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "enterprise_value",
"type": "int",
"description": "Enterprise value.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "free_cash_flow_to_firm",
"type": "int",
"description": "Free cash flow to firm.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "altman_z_score",
"type": "float",
"description": "Altman Z-score.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "beta",
"type": "float",
"description": "Beta relative to the broad market (rolling three-year).",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "dividend_yield",
"type": "float",
"description": "Dividend yield, as a normalized percent.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "earnings_yield",
"type": "float",
"description": "Earnings yield, as a normalized percent.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "last_price",
"type": "float",
"description": "Last price of the stock.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "year_high",
"type": "float",
"description": "52 week high",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "year_low",
"type": "float",
"description": "52 week low",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "volume_avg",
"type": "int",
"description": "Average daily volume.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "short_interest",
"type": "int",
"description": "Number of shares reported as sold short.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "shares_outstanding",
"type": "int",
"description": "Weighted average shares outstanding (TTM).",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "days_to_cover",
"type": "float",
"description": "Days to cover short interest, based on average daily volume.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"yfinance": [
@@ -14661,245 +16514,280 @@
"type": "float",
"description": "Forward price-to-earnings ratio.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "peg_ratio",
"type": "float",
"description": "PEG ratio (5-year expected).",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "peg_ratio_ttm",
"type": "float",
"description": "PEG ratio (TTM).",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "eps_ttm",
"type": "float",
"description": "Earnings per share (TTM).",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "eps_forward",
"type": "float",
"description": "Forward earnings per share.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "enterprise_to_ebitda",
"type": "float",
"description": "Enterprise value to EBITDA ratio.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "earnings_growth",
"type": "float",
"description": "Earnings growth (Year Over Year), as a normalized percent.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "earnings_growth_quarterly",
"type": "float",
"description": "Quarterly earnings growth (Year Over Year), as a normalized percent.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "revenue_per_share",
"type": "float",
"description": "Revenue per share (TTM).",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "revenue_growth",
"type": "float",
"description": "Revenue growth (Year Over Year), as a normalized percent.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "enterprise_to_revenue",
"type": "float",
"description": "Enterprise value to revenue ratio.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "cash_per_share",
"type": "float",
"description": "Cash per share.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "quick_ratio",
"type": "float",
"description": "Quick ratio.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "current_ratio",
"type": "float",
"description": "Current ratio.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "debt_to_equity",
"type": "float",
"description": "Debt-to-equity ratio.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "gross_margin",
"type": "float",
"description": "Gross margin, as a normalized percent.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "operating_margin",
"type": "float",
"description": "Operating margin, as a normalized percent.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "ebitda_margin",
"type": "float",
"description": "EBITDA margin, as a normalized percent.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "profit_margin",
"type": "float",
"description": "Profit margin, as a normalized percent.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "return_on_assets",
"type": "float",
"description": "Return on assets, as a normalized percent.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "return_on_equity",
"type": "float",
"description": "Return on equity, as a normalized percent.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "dividend_yield",
"type": "float",
"description": "Dividend yield, as a normalized percent.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "dividend_yield_5y_avg",
"type": "float",
"description": "5-year average dividend yield, as a normalized percent.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "payout_ratio",
"type": "float",
"description": "Payout ratio.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "book_value",
"type": "float",
"description": "Book value per share.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "price_to_book",
"type": "float",
"description": "Price-to-book ratio.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "enterprise_value",
"type": "int",
"description": "Enterprise value.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "overall_risk",
"type": "float",
"description": "Overall risk score.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "audit_risk",
"type": "float",
"description": "Audit risk score.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "board_risk",
"type": "float",
"description": "Board risk score.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "compensation_risk",
"type": "float",
"description": "Compensation risk score.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "shareholder_rights_risk",
"type": "float",
"description": "Shareholder rights risk score.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "beta",
"type": "float",
"description": "Beta relative to the broad market (5-year monthly).",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "price_return_1y",
"type": "float",
"description": "One-year price return, as a normalized percent.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "currency",
"type": "str",
"description": "Currency in which the data is presented.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -14919,7 +16807,8 @@
"type": "str",
"description": "Symbol to get data for.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "provider",
@@ -14968,49 +16857,56 @@
"type": "str",
"description": "Designation of the key executive.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "name",
"type": "str",
"description": "Name of the key executive.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "pay",
"type": "int",
"description": "Pay of the key executive.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "currency_pay",
"type": "str",
"description": "Currency of the pay.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "gender",
"type": "str",
"description": "Gender of the key executive.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "year_born",
"type": "int",
"description": "Birth year of the key executive.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "title_since",
"type": "int",
"description": "Date the tile was held since.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"fmp": [],
@@ -15020,14 +16916,16 @@
"type": "int",
"description": "Value of shares exercised.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "unexercised_value",
"type": "int",
"description": "Value of shares not exercised.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -15047,7 +16945,8 @@
"type": "Union[str, List[str]]",
"description": "Symbol to get data for. Multiple items allowed for provider(s): fmp.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "provider",
@@ -15063,7 +16962,8 @@
"type": "int",
"description": "Year of the compensation.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -15103,84 +17003,96 @@
"type": "str",
"description": "Symbol representing the entity requested in the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "cik",
"type": "str",
"description": "Central Index Key (CIK) for the requested entity.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "company_name",
"type": "str",
"description": "The name of the company.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "industry",
"type": "str",
"description": "The industry of the company.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "year",
"type": "int",
"description": "Year of the compensation.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "name_and_position",
"type": "str",
"description": "Name and position.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "salary",
"type": "Annotated[float, Ge(ge=0)]",
"description": "Salary.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "bonus",
"type": "Annotated[float, Ge(ge=0)]",
"description": "Bonus payments.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "stock_award",
"type": "Annotated[float, Ge(ge=0)]",
"description": "Stock awards.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "incentive_plan_compensation",
"type": "Annotated[float, Ge(ge=0)]",
"description": "Incentive plan compensation.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "all_other_compensation",
"type": "Annotated[float, Ge(ge=0)]",
"description": "All other compensation.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "total",
"type": "Annotated[float, Ge(ge=0)]",
"description": "Total compensation.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"fmp": [
@@ -15189,21 +17101,24 @@
"type": "date",
"description": "Date of the filing.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "accepted_date",
"type": "datetime",
"description": "Date the filing was accepted.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "url",
"type": "str",
"description": "URL to the filing data.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -15223,7 +17138,8 @@
"type": "str",
"description": "Symbol to get data for.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "provider",
@@ -15271,252 +17187,288 @@
"type": "str",
"description": "Symbol representing the entity requested in the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "price",
"type": "float",
"description": "Price of the company.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "beta",
"type": "float",
"description": "Beta of the company.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "vol_avg",
"type": "int",
"description": "Volume average of the company.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "mkt_cap",
"type": "int",
"description": "Market capitalization of the company.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "last_div",
"type": "float",
"description": "Last dividend of the company.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "range",
"type": "str",
"description": "Range of the company.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "changes",
"type": "float",
"description": "Changes of the company.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "company_name",
"type": "str",
"description": "Company name of the company.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "currency",
"type": "str",
"description": "Currency of the company.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "cik",
"type": "str",
"description": "Central Index Key (CIK) for the requested entity.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "isin",
"type": "str",
"description": "ISIN of the company.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "cusip",
"type": "str",
"description": "CUSIP of the company.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "exchange",
"type": "str",
"description": "Exchange of the company.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "exchange_short_name",
"type": "str",
"description": "Exchange short name of the company.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "industry",
"type": "str",
"description": "Industry of the company.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "website",
"type": "str",
"description": "Website of the company.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "description",
"type": "str",
"description": "Description of the company.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "ceo",
"type": "str",
"description": "CEO of the company.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "sector",
"type": "str",
"description": "Sector of the company.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "country",
"type": "str",
"description": "Country of the company.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "full_time_employees",
"type": "str",
"description": "Full time employees of the company.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "phone",
"type": "str",
"description": "Phone of the company.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "address",
"type": "str",
"description": "Address of the company.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "city",
"type": "str",
"description": "City of the company.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "state",
"type": "str",
"description": "State of the company.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "zip",
"type": "str",
"description": "Zip of the company.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "dcf_diff",
"type": "float",
"description": "Discounted cash flow difference of the company.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "dcf",
"type": "float",
"description": "Discounted cash flow of the company.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "image",
"type": "str",
"description": "Image of the company.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "ipo_date",
"type": "date",
"description": "IPO date of the company.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "default_image",
"type": "bool",
"description": "If the image is the default image.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "is_etf",
"type": "bool",
"description": "If the company is an ETF.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "is_actively_trading",
"type": "bool",
"description": "If the company is actively trading.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "is_adr",
"type": "bool",
"description": "If the company is an ADR.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "is_fund",
"type": "bool",
"description": "If the company is a fund.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
],
"fmp": []
@@ -15537,21 +17489,24 @@
"type": "str",
"description": "Symbol to get data for.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "period",
"type": "str",
"description": "Time period of the data to return.",
"default": "annual",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "limit",
"type": "int",
"description": "The number of data entries to return.",
"default": 12,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -15567,7 +17522,8 @@
"type": "Literal['annual', 'quarter', 'ttm']",
"description": "Time period of the data to return.",
"default": "annual",
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"intrinio": [
@@ -15576,14 +17532,16 @@
"type": "Literal['annual', 'quarter', 'ttm', 'ytd']",
"description": "Time period of the data to return.",
"default": "annual",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "fiscal_year",
"type": "int",
"description": "The specific fiscal year. Reports do not go beyond 2008.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -15623,21 +17581,24 @@
"type": "str",
"description": "The date of the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "fiscal_period",
"type": "str",
"description": "Period of the financial ratios.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "fiscal_year",
"type": "int",
"description": "Fiscal year.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"fmp": [
@@ -15646,392 +17607,448 @@
"type": "float",
"description": "Current ratio.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "quick_ratio",
"type": "float",
"description": "Quick ratio.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "cash_ratio",
"type": "float",
"description": "Cash ratio.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "days_of_sales_outstanding",
"type": "float",
"description": "Days of sales outstanding.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "days_of_inventory_outstanding",
"type": "float",
"description": "Days of inventory outstanding.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "operating_cycle",
"type": "float",
"description": "Operating cycle.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "days_of_payables_outstanding",
"type": "float",
"description": "Days of payables outstanding.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "cash_conversion_cycle",
"type": "float",
"description": "Cash conversion cycle.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "gross_profit_margin",
"type": "float",
"description": "Gross profit margin.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "operating_profit_margin",
"type": "float",
"description": "Operating profit margin.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "pretax_profit_margin",
"type": "float",
"description": "Pretax profit margin.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "net_profit_margin",
"type": "float",
"description": "Net profit margin.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "effective_tax_rate",
"type": "float",
"description": "Effective tax rate.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "return_on_assets",
"type": "float",
"description": "Return on assets.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "return_on_equity",
"type": "float",
"description": "Return on equity.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "return_on_capital_employed",
"type": "float",
"description": "Return on capital employed.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "net_income_per_ebt",
"type": "float",
"description": "Net income per EBT.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "ebt_per_ebit",
"type": "float",
"description": "EBT per EBIT.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "ebit_per_revenue",
"type": "float",
"description": "EBIT per revenue.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "debt_ratio",
"type": "float",
"description": "Debt ratio.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "debt_equity_ratio",
"type": "float",
"description": "Debt equity ratio.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "long_term_debt_to_capitalization",
"type": "float",
"description": "Long term debt to capitalization.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "total_debt_to_capitalization",
"type": "float",
"description": "Total debt to capitalization.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "interest_coverage",
"type": "float",
"description": "Interest coverage.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "cash_flow_to_debt_ratio",
"type": "float",
"description": "Cash flow to debt ratio.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "company_equity_multiplier",
"type": "float",
"description": "Company equity multiplier.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "receivables_turnover",
"type": "float",
"description": "Receivables turnover.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "payables_turnover",
"type": "float",
"description": "Payables turnover.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "inventory_turnover",
"type": "float",
"description": "Inventory turnover.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "fixed_asset_turnover",
"type": "float",
"description": "Fixed asset turnover.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "asset_turnover",
"type": "float",
"description": "Asset turnover.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "operating_cash_flow_per_share",
"type": "float",
"description": "Operating cash flow per share.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "free_cash_flow_per_share",
"type": "float",
"description": "Free cash flow per share.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "cash_per_share",
"type": "float",
"description": "Cash per share.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "payout_ratio",
"type": "float",
"description": "Payout ratio.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "operating_cash_flow_sales_ratio",
"type": "float",
"description": "Operating cash flow sales ratio.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "free_cash_flow_operating_cash_flow_ratio",
"type": "float",
"description": "Free cash flow operating cash flow ratio.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "cash_flow_coverage_ratios",
"type": "float",
"description": "Cash flow coverage ratios.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "short_term_coverage_ratios",
"type": "float",
"description": "Short term coverage ratios.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "capital_expenditure_coverage_ratio",
"type": "float",
"description": "Capital expenditure coverage ratio.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "dividend_paid_and_capex_coverage_ratio",
"type": "float",
"description": "Dividend paid and capex coverage ratio.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "dividend_payout_ratio",
"type": "float",
"description": "Dividend payout ratio.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "price_book_value_ratio",
"type": "float",
"description": "Price book value ratio.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "price_to_book_ratio",
"type": "float",
"description": "Price to book ratio.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "price_to_sales_ratio",
"type": "float",
"description": "Price to sales ratio.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "price_earnings_ratio",
"type": "float",
"description": "Price earnings ratio.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "price_to_free_cash_flows_ratio",
"type": "float",
"description": "Price to free cash flows ratio.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "price_to_operating_cash_flows_ratio",
"type": "float",
"description": "Price to operating cash flows ratio.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "price_cash_flow_ratio",
"type": "float",
"description": "Price cash flow ratio.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "price_earnings_to_growth_ratio",
"type": "float",
"description": "Price earnings to growth ratio.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "price_sales_ratio",
"type": "float",
"description": "Price sales ratio.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "dividend_yield",
"type": "float",
"description": "Dividend yield.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "dividend_yield_percentage",
"type": "float",
"description": "Dividend yield percentage.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "dividend_per_share",
"type": "float",
"description": "Dividend per share.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "enterprise_value_multiple",
"type": "float",
"description": "Enterprise value multiple.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "price_fair_value",
"type": "float",
"description": "Price fair value.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"intrinio": []
@@ -16052,21 +18069,24 @@
"type": "str",
"description": "Symbol to get data for.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "period",
"type": "Literal['quarter', 'annual']",
"description": "Time period of the data to return.",
"default": "annual",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "structure",
"type": "Literal['hierarchical', 'flat']",
"description": "Structure of the returned data.",
"default": "flat",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -16114,35 +18134,40 @@
"type": "date",
"description": "The end date of the reporting period.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "fiscal_period",
"type": "str",
"description": "The fiscal period of the reporting period.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "fiscal_year",
"type": "int",
"description": "The fiscal year of the reporting period.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "filing_date",
"type": "date",
"description": "The filing date of the report.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "geographic_segment",
"type": "int",
"description": "Dictionary of the revenue by geographic segment.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
],
"fmp": []
@@ -16163,21 +18188,24 @@
"type": "str",
"description": "Symbol to get data for.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "period",
"type": "Literal['quarter', 'annual']",
"description": "Time period of the data to return.",
"default": "annual",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "structure",
"type": "Literal['hierarchical', 'flat']",
"description": "Structure of the returned data.",
"default": "flat",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -16225,35 +18253,40 @@
"type": "date",
"description": "The end date of the reporting period.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "fiscal_period",
"type": "str",
"description": "The fiscal period of the reporting period.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "fiscal_year",
"type": "int",
"description": "The fiscal year of the reporting period.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "filing_date",
"type": "date",
"description": "The filing date of the report.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "business_line",
"type": "int",
"description": "Dictionary containing the revenue of the business line.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
],
"fmp": []
@@ -16274,21 +18307,24 @@
"type": "str",
"description": "Symbol to get data for.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "form_type",
"type": "str",
"description": "Filter by form type. Check the data provider for available types.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "limit",
"type": "int",
"description": "The number of data entries to return.",
"default": 100,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -16305,21 +18341,24 @@
"type": "Union[date, str]",
"description": "Start date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "end_date",
"type": "Union[date, str]",
"description": "End date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "thea_enabled",
"type": "bool",
"description": "Return filings that have been read by Intrinio's Thea NLP.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"sec": [
@@ -16328,28 +18367,32 @@
"type": "str",
"description": "Symbol to get data for.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "form_type",
"type": "Literal['1', '1-A', '1-A POS', '1-A-W', '1-E', '1-E AD', '1-K', '1-SA', '1-U', '1-Z', '1-Z-W', '10-12B', '10-12G', '10-D', '10-K', '10-KT', '10-Q', '10-QT', '11-K', '11-KT', '13F-HR', '13F-NT', '13FCONP', '144', '15-12B', '15-12G', '15-15D', '15F-12B', '15F-12G', '15F-15D', '18-12B', '18-K', '19B-4E', '2-A', '2-AF', '2-E', '20-F', '20FR12B', '20FR12G', '24F-2NT', '25', '25-NSE', '253G1', '253G2', '253G3', '253G4', '3', '305B2', '34-12H', '4', '40-17F1', '40-17F2', '40-17G', '40-17GCS', '40-202A', '40-203A', '40-206A', '40-24B2', '40-33', '40-6B', '40-8B25', '40-8F-2', '40-APP', '40-F', '40-OIP', '40FR12B', '40FR12G', '424A', '424B1', '424B2', '424B3', '424B4', '424B5', '424B7', '424B8', '424H', '425', '485APOS', '485BPOS', '485BXT', '486APOS', '486BPOS', '486BXT', '487', '497', '497AD', '497H2', '497J', '497K', '497VPI', '497VPU', '5', '6-K', '6B NTC', '6B ORDR', '8-A12B', '8-A12G', '8-K', '8-K12B', '8-K12G3', '8-K15D5', '8-M', '8F-2 NTC', '8F-2 ORDR', '9-M', 'ABS-15G', 'ABS-EE', 'ADN-MTL', 'ADV-E', 'ADV-H-C', 'ADV-H-T', 'ADV-NR', 'ANNLRPT', 'APP NTC', 'APP ORDR', 'APP WD', 'APP WDG', 'ARS', 'ATS-N', 'ATS-N-C', 'ATS-N/UA', 'AW', 'AW WD', 'C', 'C-AR', 'C-AR-W', 'C-TR', 'C-TR-W', 'C-U', 'C-U-W', 'C-W', 'CB', 'CERT', 'CERTARCA', 'CERTBATS', 'CERTCBO', 'CERTNAS', 'CERTNYS', 'CERTPAC', 'CFPORTAL', 'CFPORTAL-W', 'CORRESP', 'CT ORDER', 'D', 'DEF 14A', 'DEF 14C', 'DEFA14A', 'DEFA14C', 'DEFC14A', 'DEFC14C', 'DEFM14A', 'DEFM14C', 'DEFN14A', 'DEFR14A', 'DEFR14C', 'DEL AM', 'DFAN14A', 'DFRN14A', 'DOS', 'DOSLTR', 'DRS', 'DRSLTR', 'DSTRBRPT', 'EFFECT', 'F-1', 'F-10', 'F-10EF', 'F-10POS', 'F-1MEF', 'F-3', 'F-3ASR', 'F-3D', 'F-3DPOS', 'F-3MEF', 'F-4', 'F-4 POS', 'F-4MEF', 'F-6', 'F-6 POS', 'F-6EF', 'F-7', 'F-7 POS', 'F-8', 'F-8 POS', 'F-80', 'F-80POS', 'F-9', 'F-9 POS', 'F-N', 'F-X', 'FOCUSN', 'FWP', 'G-405', 'G-405N', 'G-FIN', 'G-FINW', 'IRANNOTICE', 'MA', 'MA-A', 'MA-I', 'MA-W', 'MSD', 'MSDCO', 'MSDW', 'N-1', 'N-14', 'N-14 8C', 'N-14MEF', 'N-18F1', 'N-1A', 'N-2', 'N-2 POSASR', 'N-23C-2', 'N-23C3A', 'N-23C3B', 'N-23C3C', 'N-2ASR', 'N-2MEF', 'N-30B-2', 'N-30D', 'N-4', 'N-5', 'N-54A', 'N-54C', 'N-6', 'N-6F', 'N-8A', 'N-8B-2', 'N-8F', 'N-8F NTC', 'N-8F ORDR', 'N-CEN', 'N-CR', 'N-CSR', 'N-CSRS', 'N-MFP', 'N-MFP1', 'N-MFP2', 'N-PX', 'N-Q', 'N-VP', 'N-VPFS', 'NO ACT', 'NPORT-EX', 'NPORT-NP', 'NPORT-P', 'NRSRO-CE', 'NRSRO-UPD', 'NSAR-A', 'NSAR-AT', 'NSAR-B', 'NSAR-BT', 'NSAR-U', 'NT 10-D', 'NT 10-K', 'NT 10-Q', 'NT 11-K', 'NT 20-F', 'NT N-CEN', 'NT N-MFP', 'NT N-MFP1', 'NT N-MFP2', 'NT NPORT-EX', 'NT NPORT-P', 'NT-NCEN', 'NT-NCSR', 'NT-NSAR', 'NTFNCEN', 'NTFNCSR', 'NTFNSAR', 'NTN 10D', 'NTN 10K', 'NTN 10Q', 'NTN 20F', 'OIP NTC', 'OIP ORDR', 'POS 8C', 'POS AM', 'POS AMI', 'POS EX', 'POS462B', 'POS462C', 'POSASR', 'PRE 14A', 'PRE 14C', 'PREC14A', 'PREC14C', 'PREM14A', 'PREM14C', 'PREN14A', 'PRER14A', 'PRER14C', 'PRRN14A', 'PX14A6G', 'PX14A6N', 'QRTLYRPT', 'QUALIF', 'REG-NR', 'REVOKED', 'RW', 'RW WD', 'S-1', 'S-11', 'S-11MEF', 'S-1MEF', 'S-20', 'S-3', 'S-3ASR', 'S-3D', 'S-3DPOS', 'S-3MEF', 'S-4', 'S-4 POS', 'S-4EF', 'S-4MEF', 'S-6', 'S-8', 'S-8 POS', 'S-B', 'S-BMEF', 'SBSE', 'SBSE-A', 'SBSE-BD', 'SBSE-C', 'SBSE-W', 'SC 13D', 'SC 13E1', 'SC 13E3', 'SC 13G', 'SC 14D9', 'SC 14F1', 'SC 14N', 'SC TO-C', 'SC TO-I', 'SC TO-T', 'SC13E4F', 'SC14D1F', 'SC14D9C', 'SC14D9F', 'SD', 'SDR', 'SE', 'SEC ACTION', 'SEC STAFF ACTION', 'SEC STAFF LETTER', 'SF-1', 'SF-3', 'SL', 'SP 15D2', 'STOP ORDER', 'SUPPL', 'T-3', 'TA-1', 'TA-2', 'TA-W', 'TACO', 'TH', 'TTW', 'UNDER', 'UPLOAD', 'WDL-REQ', 'X-17A-5']",
"description": "Type of the SEC filing form.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "cik",
"type": "Union[int, str]",
"description": "Lookup filings by Central Index Key (CIK) instead of by symbol.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "use_cache",
"type": "bool",
"description": "Whether or not to use cache. If True, cache will store for one day.",
"default": true,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -16389,49 +18432,56 @@
"type": "date",
"description": "The date of the filing.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "accepted_date",
"type": "datetime",
"description": "Accepted date of the filing.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "symbol",
"type": "str",
"description": "Symbol representing the entity requested in the data.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "cik",
"type": "str",
"description": "Central Index Key (CIK) for the requested entity.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "report_type",
"type": "str",
"description": "Type of filing.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "filing_url",
"type": "str",
"description": "URL to the filing page.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "report_url",
"type": "str",
"description": "URL to the actual report.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
],
"fmp": [],
@@ -16441,42 +18491,48 @@
"type": "str",
"description": "Intrinio ID of the filing.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "period_end_date",
"type": "date",
"description": "Ending date of the fiscal period for the filing.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "sec_unique_id",
"type": "str",
"description": "SEC unique ID of the filing.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "instance_url",
"type": "str",
"description": "URL for the XBRL filing for the report.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "industry_group",
"type": "str",
"description": "Industry group of the company.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "industry_category",
"type": "str",
"description": "Industry category of the company.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
],
"sec": [
@@ -16485,91 +18541,104 @@
"type": "date",
"description": "The date of the filing.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "act",
"type": "Union[int, str]",
"description": "The SEC Act number.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "items",
"type": "Union[str, float]",
"description": "The SEC Item numbers.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "primary_doc_description",
"type": "str",
"description": "The description of the primary document.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "primary_doc",
"type": "str",
"description": "The filename of the primary document.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "accession_number",
"type": "Union[int, str]",
"description": "The accession number.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "file_number",
"type": "Union[int, str]",
"description": "The file number.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "film_number",
"type": "Union[int, str]",
"description": "The film number.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "is_inline_xbrl",
"type": "Union[int, str]",
"description": "Whether the filing is an inline XBRL filing.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "is_xbrl",
"type": "Union[int, str]",
"description": "Whether the filing is an XBRL filing.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "size",
"type": "Union[int, str]",
"description": "The size of the filing.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "complete_submission_url",
"type": "str",
"description": "The URL to the complete filing submission.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "filing_detail_url",
"type": "str",
"description": "The URL to the filing details.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -16589,7 +18658,8 @@
"type": "str",
"description": "Symbol to get data for.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "provider",
@@ -16637,28 +18707,32 @@
"type": "date",
"description": "The date of the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "numerator",
"type": "float",
"description": "Numerator of the split.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "denominator",
"type": "float",
"description": "Denominator of the split.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "split_ratio",
"type": "str",
"description": "Split ratio.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"fmp": []
@@ -16679,14 +18753,16 @@
"type": "str",
"description": "Symbol to get data for.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "year",
"type": "int",
"description": "Year of the earnings call transcript.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "provider",
@@ -16734,35 +18810,40 @@
"type": "str",
"description": "Symbol representing the entity requested in the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "quarter",
"type": "int",
"description": "Quarter of the earnings call transcript.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "year",
"type": "int",
"description": "Year of the earnings call transcript.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "date",
"type": "datetime",
"description": "The date of the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "content",
"type": "str",
"description": "Content of the earnings call transcript.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
],
"fmp": []
@@ -16783,14 +18864,16 @@
"type": "str",
"description": "Symbol to get data for.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "limit",
"type": "int",
"description": "The number of data entries to return. Default is 252, the number of trading days in a year.",
"default": 252,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -16838,14 +18921,16 @@
"type": "date",
"description": "The date of the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "trailing_dividend_yield",
"type": "float",
"description": "Trailing dividend yield.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
],
"tiingo": []
@@ -16866,21 +18951,24 @@
"type": "str",
"description": "Symbol to get data for.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "date",
"type": "Union[date, str]",
"description": "A specific date to get data for.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "page",
"type": "int",
"description": "Page number of the data to fetch.",
"default": 0,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -16928,273 +19016,312 @@
"type": "date",
"description": "The date of the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "cik",
"type": "int",
"description": "Central Index Key (CIK) for the requested entity.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "filing_date",
"type": "date",
"description": "Filing date of the stock ownership.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "investor_name",
"type": "str",
"description": "Investor name of the stock ownership.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "symbol",
"type": "str",
"description": "Symbol representing the entity requested in the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "security_name",
"type": "str",
"description": "Security name of the stock ownership.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "type_of_security",
"type": "str",
"description": "Type of security of the stock ownership.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "security_cusip",
"type": "str",
"description": "Security cusip of the stock ownership.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "shares_type",
"type": "str",
"description": "Shares type of the stock ownership.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "put_call_share",
"type": "str",
"description": "Put call share of the stock ownership.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "investment_discretion",
"type": "str",
"description": "Investment discretion of the stock ownership.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "industry_title",
"type": "str",
"description": "Industry title of the stock ownership.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "weight",
"type": "float",
"description": "Weight of the stock ownership.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "last_weight",
"type": "float",
"description": "Last weight of the stock ownership.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "change_in_weight",
"type": "float",
"description": "Change in weight of the stock ownership.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "change_in_weight_percentage",
"type": "float",
"description": "Change in weight percentage of the stock ownership.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "market_value",
"type": "int",
"description": "Market value of the stock ownership.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "last_market_value",
"type": "int",
"description": "Last market value of the stock ownership.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "change_in_market_value",
"type": "int",
"description": "Change in market value of the stock ownership.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "change_in_market_value_percentage",
"type": "float",
"description": "Change in market value percentage of the stock ownership.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "shares_number",
"type": "int",
"description": "Shares number of the stock ownership.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "last_shares_number",
"type": "int",
"description": "Last shares number of the stock ownership.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "change_in_shares_number",
"type": "float",
"description": "Change in shares number of the stock ownership.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "change_in_shares_number_percentage",
"type": "float",
"description": "Change in shares number percentage of the stock ownership.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "quarter_end_price",
"type": "float",
"description": "Quarter end price of the stock ownership.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "avg_price_paid",
"type": "float",
"description": "Average price paid of the stock ownership.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "is_new",
"type": "bool",
"description": "Is the stock ownership new.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "is_sold_out",
"type": "bool",
"description": "Is the stock ownership sold out.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "ownership",
"type": "float",
"description": "How much is the ownership.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "last_ownership",
"type": "float",
"description": "Last ownership amount.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "change_in_ownership",
"type": "float",
"description": "Change in ownership amount.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "change_in_ownership_percentage",
"type": "float",
"description": "Change in ownership percentage.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "holding_period",
"type": "int",
"description": "Holding period of the stock ownership.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "first_added",
"type": "date",
"description": "First added date of the stock ownership.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "performance",
"type": "float",
"description": "Performance of the stock ownership.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "performance_percentage",
"type": "float",
"description": "Performance percentage of the stock ownership.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "last_performance",
"type": "float",
"description": "Last performance of the stock ownership.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "change_in_performance",
"type": "float",
"description": "Change in performance of the stock ownership.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "is_counted_for_performance",
"type": "bool",
"description": "Is the stock ownership counted for performance.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
],
"fmp": []
@@ -17215,7 +19342,8 @@
"type": "str",
"description": "Symbol to get data for.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "provider",
@@ -17231,14 +19359,16 @@
"type": "bool",
"description": "Include current quarter data.",
"default": false,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "date",
"type": "Union[date, str]",
"description": "A specific date to get data for.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -17278,21 +19408,24 @@
"type": "str",
"description": "Symbol representing the entity requested in the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "cik",
"type": "str",
"description": "Central Index Key (CIK) for the requested entity.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "date",
"type": "date",
"description": "The date of the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
],
"fmp": [
@@ -17301,231 +19434,264 @@
"type": "int",
"description": "Number of investors holding the stock.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "last_investors_holding",
"type": "int",
"description": "Number of investors holding the stock in the last quarter.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "investors_holding_change",
"type": "int",
"description": "Change in the number of investors holding the stock.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "number_of_13f_shares",
"type": "int",
"description": "Number of 13F shares.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "last_number_of_13f_shares",
"type": "int",
"description": "Number of 13F shares in the last quarter.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "number_of_13f_shares_change",
"type": "int",
"description": "Change in the number of 13F shares.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "total_invested",
"type": "float",
"description": "Total amount invested.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "last_total_invested",
"type": "float",
"description": "Total amount invested in the last quarter.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "total_invested_change",
"type": "float",
"description": "Change in the total amount invested.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "ownership_percent",
"type": "float",
"description": "Ownership percent.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "last_ownership_percent",
"type": "float",
"description": "Ownership percent in the last quarter.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "ownership_percent_change",
"type": "float",
"description": "Change in the ownership percent.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "new_positions",
"type": "int",
"description": "Number of new positions.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "last_new_positions",
"type": "int",
"description": "Number of new positions in the last quarter.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "new_positions_change",
"type": "int",
"description": "Change in the number of new positions.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "increased_positions",
"type": "int",
"description": "Number of increased positions.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "last_increased_positions",
"type": "int",
"description": "Number of increased positions in the last quarter.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "increased_positions_change",
"type": "int",
"description": "Change in the number of increased positions.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "closed_positions",
"type": "int",
"description": "Number of closed positions.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "last_closed_positions",
"type": "int",
"description": "Number of closed positions in the last quarter.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "closed_positions_change",
"type": "int",
"description": "Change in the number of closed positions.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "reduced_positions",
"type": "int",
"description": "Number of reduced positions.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "last_reduced_positions",
"type": "int",
"description": "Number of reduced positions in the last quarter.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "reduced_positions_change",
"type": "int",
"description": "Change in the number of reduced positions.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "total_calls",
"type": "int",
"description": "Total number of call options contracts traded for Apple Inc. on the specified date.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "last_total_calls",
"type": "int",
"description": "Total number of call options contracts traded for Apple Inc. on the previous reporting date.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "total_calls_change",
"type": "int",
"description": "Change in the total number of call options contracts traded between the current and previous reporting dates.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "total_puts",
"type": "int",
"description": "Total number of put options contracts traded for Apple Inc. on the specified date.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "last_total_puts",
"type": "int",
"description": "Total number of put options contracts traded for Apple Inc. on the previous reporting date.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "total_puts_change",
"type": "int",
"description": "Change in the total number of put options contracts traded between the current and previous reporting dates.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "put_call_ratio",
"type": "float",
"description": "Put-call ratio, which is the ratio of the total number of put options to call options traded on the specified date.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "last_put_call_ratio",
"type": "float",
"description": "Put-call ratio on the previous reporting date.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "put_call_ratio_change",
"type": "float",
"description": "Change in the put-call ratio between the current and previous reporting dates.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
]
},
@@ -17545,14 +19711,16 @@
"type": "str",
"description": "Symbol to get data for.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "limit",
"type": "int",
"description": "The number of data entries to return.",
"default": 500,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -17568,7 +19736,8 @@
"type": "Literal[None, 'award', 'conversion', 'return', 'expire_short', 'in_kind', 'gift', 'expire_long', 'discretionary', 'other', 'small', 'exempt', 'otm', 'purchase', 'sale', 'tender', 'will', 'itm', 'trust']",
"description": "Type of the transaction.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"intrinio": [
@@ -17577,28 +19746,32 @@
"type": "Union[date, str]",
"description": "Start date of the data, in YYYY-MM-DD format.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "end_date",
"type": "Union[date, str]",
"description": "End date of the data, in YYYY-MM-DD format.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "ownership_type",
"type": "Literal['D', 'I']",
"description": "Type of ownership.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "sort_by",
"type": "Literal['filing_date', 'updated_on']",
"description": "Field to sort by.",
"default": "updated_on",
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -17638,98 +19811,112 @@
"type": "str",
"description": "Symbol representing the entity requested in the data.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "company_cik",
"type": "Union[int, str]",
"description": "CIK number of the company.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "filing_date",
"type": "Union[date, datetime]",
"description": "Filing date of the trade.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "transaction_date",
"type": "date",
"description": "Date of the transaction.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "owner_cik",
"type": "Union[int, str]",
"description": "Reporting individual's CIK.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "owner_name",
"type": "str",
"description": "Name of the reporting individual.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "owner_title",
"type": "str",
"description": "The title held by the reporting individual.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "transaction_type",
"type": "str",
"description": "Type of transaction being reported.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "acquisition_or_disposition",
"type": "str",
"description": "Acquisition or disposition of the shares.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "security_type",
"type": "str",
"description": "The type of security transacted.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "securities_owned",
"type": "float",
"description": "Number of securities owned by the reporting individual.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "securities_transacted",
"type": "float",
"description": "Number of securities transacted by the reporting individual.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "transaction_price",
"type": "float",
"description": "The price of the transaction.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "filing_url",
"type": "str",
"description": "Link to the filing.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"fmp": [
@@ -17738,7 +19925,8 @@
"type": "str",
"description": "Form type of the insider trading.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
],
"intrinio": [
@@ -17747,105 +19935,120 @@
"type": "str",
"description": "URL of the filing.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "company_name",
"type": "str",
"description": "Name of the company.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "conversion_exercise_price",
"type": "float",
"description": "Conversion/Exercise price of the shares.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "deemed_execution_date",
"type": "date",
"description": "Deemed execution date of the trade.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "exercise_date",
"type": "date",
"description": "Exercise date of the trade.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "expiration_date",
"type": "date",
"description": "Expiration date of the derivative.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "underlying_security_title",
"type": "str",
"description": "Name of the underlying non-derivative security related to this derivative transaction.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "underlying_shares",
"type": "Union[int, float]",
"description": "Number of underlying shares related to this derivative transaction.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "nature_of_ownership",
"type": "str",
"description": "Nature of ownership of the insider trading.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "director",
"type": "bool",
"description": "Whether the owner is a director.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "officer",
"type": "bool",
"description": "Whether the owner is an officer.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "ten_percent_owner",
"type": "bool",
"description": "Whether the owner is a 10% owner.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "other_relation",
"type": "bool",
"description": "Whether the owner is having another relation.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "derivative_transaction",
"type": "bool",
"description": "Whether the owner is having a derivative transaction.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "report_line_number",
"type": "int",
"description": "Report line number of the insider trading.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -17865,7 +20068,8 @@
"type": "Union[str, List[str]]",
"description": "Symbol to get data for. Multiple items allowed for provider(s): yfinance.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "provider",
@@ -17915,42 +20119,48 @@
"type": "str",
"description": "Symbol representing the entity requested in the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "date",
"type": "date",
"description": "The date of the data.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "free_float",
"type": "float",
"description": "Percentage of unrestricted shares of a publicly-traded company.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "float_shares",
"type": "float",
"description": "Number of shares available for trading by the general public.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "outstanding_shares",
"type": "float",
"description": "Total number of shares of a publicly-traded company.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "source",
"type": "str",
"description": "Source of the received data.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"fmp": [],
@@ -17960,14 +20170,16 @@
"type": "float",
"description": "Total number of shares of a publicly-traded company, adjusted for splits.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "public_float",
"type": "float",
"description": "Aggregate market value of the shares of a publicly-traded company.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"yfinance": [
@@ -17976,70 +20188,80 @@
"type": "int",
"description": "Implied Shares Outstanding of common equity, assuming the conversion of all convertible subsidiary equity into common.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "short_interest",
"type": "int",
"description": "Number of shares that are reported short.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "short_percent_of_float",
"type": "float",
"description": "Percentage of shares that are reported short, as a normalized percent.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "days_to_cover",
"type": "float",
"description": "Number of days to repurchase the shares as a ratio of average daily volume",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "short_interest_prev_month",
"type": "int",
"description": "Number of shares that were reported short in the previous month.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "short_interest_prev_date",
"type": "date",
"description": "Date of the previous month's report.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "insider_ownership",
"type": "float",
"description": "Percentage of shares held by insiders, as a normalized percent.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "institution_ownership",
"type": "float",
"description": "Percentage of shares held by institutions, as a normalized percent.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "institution_float_ownership",
"type": "float",
"description": "Percentage of float held by institutions, as a normalized percent.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "institutions_count",
"type": "int",
"description": "Number of institutions holding shares.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -18059,21 +20281,24 @@
"type": "str",
"description": "Symbol to get data for. A CIK or Symbol can be used.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "date",
"type": "Union[date, str]",
"description": "A specific date to get data for. The date represents the end of the reporting period. All form 13F-HR filings are based on the calendar year and are reported quarterly. If a date is not supplied, the most recent filing is returned. Submissions beginning 2013-06-30 are supported.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "limit",
"type": "int",
"description": "The number of data entries to return. The number of previous filings to return. The date parameter takes priority over this parameter.",
"default": 1,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -18121,77 +20346,88 @@
"type": "date",
"description": "The end-of-quarter date of the filing.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "issuer",
"type": "str",
"description": "The name of the issuer.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "cusip",
"type": "str",
"description": "The CUSIP of the security.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "asset_class",
"type": "str",
"description": "The title of the asset class for the security.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "security_type",
"type": "Literal['SH', 'PRN']",
"description": "The total number of shares of the class of security or the principal amount of such class. 'SH' for shares. 'PRN' for principal amount. Convertible debt securities are reported as 'PRN'.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "option_type",
"type": "Literal['call', 'put']",
"description": "Defined when the holdings being reported are put or call options. Only long positions are reported.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "voting_authority_sole",
"type": "int",
"description": "The number of shares for which the Manager exercises sole voting authority (none).",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "voting_authority_shared",
"type": "int",
"description": "The number of shares for which the Manager exercises a defined shared voting authority (none).",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "voting_authority_other",
"type": "int",
"description": "The number of shares for which the Manager exercises other shared voting authority (none).",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "principal_amount",
"type": "int",
"description": "The total number of shares of the class of security or the principal amount of such class. Only long positions are reported",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "value",
"type": "int",
"description": "The fair market value of the holding of the particular class of security. The value reported for options is the fair market value of the underlying security with respect to the number of shares controlled. Values are rounded to the nearest US dollar and use the closing price of the last trading day of the calendar year or quarter.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
],
"sec": [
@@ -18200,7 +20436,8 @@
"type": "float",
"description": "The weight of the security relative to the market value of all securities in the filing , as a normalized percent.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
]
},
@@ -18220,7 +20457,8 @@
"type": "Union[str, List[str]]",
"description": "Symbol to get data for. Multiple items allowed for provider(s): fmp, intrinio, yfinance.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "provider",
@@ -18237,14 +20475,16 @@
"type": "str",
"description": "A Security identifier (Ticker, FIGI, ISIN, CUSIP, Intrinio ID).",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "source",
"type": "Literal['iex', 'bats', 'bats_delayed', 'utp_delayed', 'cta_a_delayed', 'cta_b_delayed', 'intrinio_mx', 'intrinio_mx_plus', 'delayed_sip']",
"description": "Source of the data.",
"default": "iex",
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"yfinance": []
@@ -18285,231 +20525,264 @@
"type": "str",
"description": "Symbol representing the entity requested in the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "asset_type",
"type": "str",
"description": "Type of asset - i.e, stock, ETF, etc.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "name",
"type": "str",
"description": "Name of the company or asset.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "exchange",
"type": "str",
"description": "The name or symbol of the venue where the data is from.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "bid",
"type": "float",
"description": "Price of the top bid order.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "bid_size",
"type": "int",
"description": "This represents the number of round lot orders at the given price. The normal round lot size is 100 shares. A size of 2 means there are 200 shares available at the given price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "bid_exchange",
"type": "str",
"description": "The specific trading venue where the purchase order was placed.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "ask",
"type": "float",
"description": "Price of the top ask order.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "ask_size",
"type": "int",
"description": "This represents the number of round lot orders at the given price. The normal round lot size is 100 shares. A size of 2 means there are 200 shares available at the given price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "ask_exchange",
"type": "str",
"description": "The specific trading venue where the sale order was placed.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "quote_conditions",
"type": "Union[str, int, List[str], List[int]]",
"description": "Conditions or condition codes applicable to the quote.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "quote_indicators",
"type": "Union[str, int, List[str], List[int]]",
"description": "Indicators or indicator codes applicable to the participant quote related to the price bands for the issue, or the affect the quote has on the NBBO.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "sales_conditions",
"type": "Union[str, int, List[str], List[int]]",
"description": "Conditions or condition codes applicable to the sale.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "sequence_number",
"type": "int",
"description": "The sequence number represents the sequence in which message events happened. These are increasing and unique per ticker symbol, but will not always be sequential (e.g., 1, 2, 6, 9, 10, 11).",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "market_center",
"type": "str",
"description": "The ID of the UTP participant that originated the message.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "participant_timestamp",
"type": "datetime",
"description": "Timestamp for when the quote was generated by the exchange.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "trf_timestamp",
"type": "datetime",
"description": "Timestamp for when the TRF (Trade Reporting Facility) received the message.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "sip_timestamp",
"type": "datetime",
"description": "Timestamp for when the SIP (Security Information Processor) received the message from the exchange.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "last_price",
"type": "float",
"description": "Price of the last trade.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "last_tick",
"type": "str",
"description": "Whether the last sale was an up or down tick.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "last_size",
"type": "int",
"description": "Size of the last trade.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "last_timestamp",
"type": "datetime",
"description": "Date and Time when the last price was recorded.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "open",
"type": "float",
"description": "The open price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "high",
"type": "float",
"description": "The high price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "low",
"type": "float",
"description": "The low price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "close",
"type": "float",
"description": "The close price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "volume",
"type": "Union[int, float]",
"description": "The trading volume.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "exchange_volume",
"type": "Union[int, float]",
"description": "Volume of shares exchanged during the trading day on the specific exchange.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "prev_close",
"type": "float",
"description": "The previous close price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "change",
"type": "float",
"description": "Change in price from previous close.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "change_percent",
"type": "float",
"description": "Change in price as a normalized percentage.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "year_high",
"type": "float",
"description": "The one year high (52W High).",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "year_low",
"type": "float",
"description": "The one year low (52W Low).",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"fmp": [
@@ -18518,56 +20791,64 @@
"type": "float",
"description": "50 day moving average price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "price_avg200",
"type": "float",
"description": "200 day moving average price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "avg_volume",
"type": "int",
"description": "Average volume over the last 10 trading days.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "market_cap",
"type": "float",
"description": "Market cap of the company.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "shares_outstanding",
"type": "int",
"description": "Number of shares outstanding.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "eps",
"type": "float",
"description": "Earnings per share.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "pe",
"type": "float",
"description": "Price earnings ratio.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "earnings_announcement",
"type": "datetime",
"description": "Upcoming earnings announcement date.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"intrinio": [
@@ -18576,28 +20857,32 @@
"type": "bool",
"description": "Whether or not the current trade is from a darkpool.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "source",
"type": "str",
"description": "Source of the Intrinio data.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "updated_on",
"type": "datetime",
"description": "Date and Time when the data was last updated.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "security",
"type": "IntrinioSecurity",
"description": "Security details related to the quote.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"yfinance": [
@@ -18606,35 +20891,40 @@
"type": "float",
"description": "50-day moving average price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "ma_200d",
"type": "float",
"description": "200-day moving average price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "volume_average",
"type": "float",
"description": "Average daily trading volume.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "volume_average_10d",
"type": "float",
"description": "Average daily trading volume in the last 10 days.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "currency",
"type": "str",
"description": "Currency of the price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -18654,7 +20944,8 @@
"type": "str",
"description": "Symbol to get data for.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "provider",
@@ -18670,42 +20961,48 @@
"type": "int",
"description": "The number of data entries to return. Up to ten million records will be returned. Pagination occurs in groups of 50,000. Remaining limit values will always return 50,000 more records unless it is the last page. High volume tickers will require multiple max requests for a single day's NBBO records. Expect stocks, like SPY, to approach 1GB in size, per day, as a raw CSV. Splitting large requests into chunks is recommended for full-day requests of high-volume symbols.",
"default": 50000,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "date",
"type": "Union[date, str]",
"description": "A specific date to get data for. Use bracketed the timestamp parameters to specify exact time ranges.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "timestamp_lt",
"type": "Union[datetime, str]",
"description": "Query by datetime, less than. Either a date with the format 'YYYY-MM-DD' or a TZ-aware timestamp string, 'YYYY-MM-DDTH:M:S.000000000-04:00'. Include all nanoseconds and the 'T' between the day and hour.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "timestamp_gt",
"type": "Union[datetime, str]",
"description": "Query by datetime, greater than. Either a date with the format 'YYYY-MM-DD' or a TZ-aware timestamp string, 'YYYY-MM-DDTH:M:S.000000000-04:00'. Include all nanoseconds and the 'T' between the day and hour.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "timestamp_lte",
"type": "Union[datetime, str]",
"description": "Query by datetime, less than or equal to. Either a date with the format 'YYYY-MM-DD' or a TZ-aware timestamp string, 'YYYY-MM-DDTH:M:S.000000000-04:00'. Include all nanoseconds and the 'T' between the day and hour.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "timestamp_gte",
"type": "Union[datetime, str]",
"description": "Query by datetime, greater than or equal to. Either a date with the format 'YYYY-MM-DD' or a TZ-aware timestamp string, 'YYYY-MM-DDTH:M:S.000000000-04:00'. Include all nanoseconds and the 'T' between the day and hour.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -18745,42 +21042,48 @@
"type": "str",
"description": "The exchange ID for the ask.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "ask",
"type": "float",
"description": "The last ask price.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "ask_size",
"type": "int",
"description": "The ask size. This represents the number of round lot orders at the given ask price. The normal round lot size is 100 shares. An ask size of 2 means there are 200 shares available to purchase at the given ask price.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "bid_size",
"type": "int",
"description": "The bid size in round lots.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "bid",
"type": "float",
"description": "The last bid price.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "bid_exchange",
"type": "str",
"description": "The exchange ID for the bid.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
],
"polygon": [
@@ -18789,49 +21092,56 @@
"type": "str",
"description": "The exchange tape.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "conditions",
"type": "Union[str, List[int], List[str]]",
"description": "A list of condition codes.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "indicators",
"type": "List[int]",
"description": "A list of indicator codes.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "sequence_num",
"type": "int",
"description": "The sequence number represents the sequence in which message events happened. These are increasing and unique per ticker symbol, but will not always be sequential (e.g., 1, 2, 6, 9, 10, 11)",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "participant_timestamp",
"type": "datetime",
"description": "The nanosecond accuracy Participant/Exchange Unix Timestamp. This is the timestamp of when the quote was actually generated at the exchange.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "sip_timestamp",
"type": "datetime",
"description": "The nanosecond accuracy SIP Unix Timestamp. This is the timestamp of when the SIP received this quote from the exchange which produced it.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "trf_timestamp",
"type": "datetime",
"description": "The nanosecond accuracy TRF (Trade Reporting Facility) Unix Timestamp. This is the timestamp of when the trade reporting facility received this quote.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -18851,28 +21161,32 @@
"type": "Union[str, List[str]]",
"description": "Symbol to get data for. Multiple items allowed for provider(s): fmp, polygon, tiingo, yfinance.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "interval",
"type": "str",
"description": "Time interval of the data to return.",
"default": "1d",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "start_date",
"type": "Union[date, str]",
"description": "Start date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "end_date",
"type": "Union[date, str]",
"description": "End date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -18888,7 +21202,8 @@
"type": "Literal['1m', '5m', '15m', '30m', '1h', '4h', '1d']",
"description": "Time interval of the data to return.",
"default": "1d",
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"intrinio": [
@@ -18897,42 +21212,48 @@
"type": "str",
"description": "A Security identifier (Ticker, FIGI, ISIN, CUSIP, Intrinio ID).",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "interval",
"type": "Literal['1m', '5m', '10m', '15m', '30m', '60m', '1h', '1d', '1W', '1M', '1Q', '1Y']",
"description": "Time interval of the data to return.",
"default": "1d",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "start_time",
"type": "datetime.time",
"description": "Return intervals starting at the specified time on the `start_date` formatted as 'HH:MM:SS'.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "end_time",
"type": "datetime.time",
"description": "Return intervals stopping at the specified time on the `end_date` formatted as 'HH:MM:SS'.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "timezone",
"type": "str",
"description": "Timezone of the data, in the IANA format (Continent/City).",
"default": "America/New_York",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "source",
"type": "Literal['realtime', 'delayed', 'nasdaq_basic']",
"description": "The source of the data.",
"default": "realtime",
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"polygon": [
@@ -18941,35 +21262,40 @@
"type": "str",
"description": "Time interval of the data to return. The numeric portion of the interval can be any positive integer. The letter portion can be one of the following: s, m, h, d, W, M, Q, Y",
"default": "1d",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "adjustment",
"type": "Literal['splits_only', 'unadjusted']",
"description": "The adjustment factor to apply. Default is splits only.",
"default": "splits_only",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "extended_hours",
"type": "bool",
"description": "Include Pre and Post market data.",
"default": false,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "sort",
"type": "Literal['asc', 'desc']",
"description": "Sort order of the data. This impacts the results in combination with the 'limit' parameter. The results are always returned in ascending order by date.",
"default": "asc",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "limit",
"type": "int",
"description": "The number of data entries to return.",
"default": 49999,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"tiingo": [
@@ -18978,7 +21304,8 @@
"type": "Literal['1d', '1W', '1M', '1Y']",
"description": "Time interval of the data to return.",
"default": "1d",
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"yfinance": [
@@ -18987,42 +21314,48 @@
"type": "Literal['1m', '2m', '5m', '15m', '30m', '60m', '90m', '1h', '1d', '5d', '1W', '1M', '1Q']",
"description": "Time interval of the data to return.",
"default": "1d",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "extended_hours",
"type": "bool",
"description": "Include Pre and Post market data.",
"default": false,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "include_actions",
"type": "bool",
"description": "Include dividends and stock splits in results.",
"default": true,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "adjustment",
"type": "Literal['splits_only', 'splits_and_dividends']",
"description": "The adjustment factor to apply. Default is splits only.",
"default": "splits_only",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "adjusted",
"type": "bool",
"description": "This field is deprecated (4.1.5) and will be removed in a future version. Use 'adjustment' set as 'splits_and_dividends' instead.",
"default": false,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "prepost",
"type": "bool",
"description": "This field is deprecated (4.1.5) and will be removed in a future version. Use 'extended_hours' as True instead.",
"default": false,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -19062,49 +21395,56 @@
"type": "Union[date, datetime]",
"description": "The date of the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "open",
"type": "float",
"description": "The open price.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "high",
"type": "float",
"description": "The high price.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "low",
"type": "float",
"description": "The low price.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "close",
"type": "float",
"description": "The close price.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "volume",
"type": "Union[int, float]",
"description": "The trading volume.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "vwap",
"type": "float",
"description": "Volume Weighted Average Price over the period.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"fmp": [
@@ -19113,28 +21453,32 @@
"type": "float",
"description": "The adjusted close price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "unadjusted_volume",
"type": "float",
"description": "Unadjusted volume of the symbol.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "change",
"type": "float",
"description": "Change in the price from the previous close.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "change_percent",
"type": "float",
"description": "Change in the price from the previous close, as a normalized percent.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"intrinio": [
@@ -19143,112 +21487,128 @@
"type": "float",
"description": "Average trade price of an individual equity during the interval.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "change",
"type": "float",
"description": "Change in the price of the symbol from the previous day.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "change_percent",
"type": "float",
"description": "Percent change in the price of the symbol from the previous day.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "adj_open",
"type": "float",
"description": "The adjusted open price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "adj_high",
"type": "float",
"description": "The adjusted high price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "adj_low",
"type": "float",
"description": "The adjusted low price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "adj_close",
"type": "float",
"description": "The adjusted close price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "adj_volume",
"type": "float",
"description": "The adjusted volume.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "fifty_two_week_high",
"type": "float",
"description": "52 week high price for the symbol.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "fifty_two_week_low",
"type": "float",
"description": "52 week low price for the symbol.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "factor",
"type": "float",
"description": "factor by which to multiply equity prices before this date, in order to calculate historically-adjusted equity prices.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "split_ratio",
"type": "float",
"description": "Ratio of the equity split, if a split occurred.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "dividend",
"type": "float",
"description": "Dividend amount, if a dividend was paid.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "close_time",
"type": "datetime",
"description": "The timestamp that represents the end of the interval span.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "interval",
"type": "str",
"description": "The data time frequency.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "intra_period",
"type": "bool",
"description": "If true, the equity price represents an unfinished period (be it day, week, quarter, month, or year), meaning that the close price is the latest price available, not the official close price for the period",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"polygon": [
@@ -19257,7 +21617,8 @@
"type": "Annotated[int, Gt(gt=0)]",
"description": "Number of transactions for the symbol in the time period.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"tiingo": [
@@ -19266,49 +21627,56 @@
"type": "float",
"description": "The adjusted open price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "adj_high",
"type": "float",
"description": "The adjusted high price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "adj_low",
"type": "float",
"description": "The adjusted low price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "adj_close",
"type": "float",
"description": "The adjusted close price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "adj_volume",
"type": "float",
"description": "The adjusted volume.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "split_ratio",
"type": "float",
"description": "Ratio of the equity split, if a split occurred.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "dividend",
"type": "float",
"description": "Dividend amount, if a dividend was paid.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"yfinance": [
@@ -19317,14 +21685,16 @@
"type": "float",
"description": "Ratio of the equity split, if a split occurred.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "dividend",
"type": "float",
"description": "Dividend amount (split-adjusted), if a dividend was paid.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -19344,7 +21714,8 @@
"type": "Union[str, List[str]]",
"description": "Symbol to get data for. Multiple items allowed for provider(s): fmp.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "provider",
@@ -19392,119 +21763,136 @@
"type": "str",
"description": "Symbol representing the entity requested in the data.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "one_day",
"type": "float",
"description": "One-day return.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "wtd",
"type": "float",
"description": "Week to date return.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "one_week",
"type": "float",
"description": "One-week return.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "mtd",
"type": "float",
"description": "Month to date return.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "one_month",
"type": "float",
"description": "One-month return.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "qtd",
"type": "float",
"description": "Quarter to date return.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "three_month",
"type": "float",
"description": "Three-month return.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "six_month",
"type": "float",
"description": "Six-month return.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "ytd",
"type": "float",
"description": "Year to date return.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "one_year",
"type": "float",
"description": "One-year return.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "two_year",
"type": "float",
"description": "Two-year return.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "three_year",
"type": "float",
"description": "Three-year return.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "four_year",
"type": "float",
"description": "Four-year",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "five_year",
"type": "float",
"description": "Five-year return.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "ten_year",
"type": "float",
"description": "Ten-year return.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "max",
"type": "float",
"description": "Return from the beginning of the time series.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"fmp": [
@@ -19513,7 +21901,8 @@
"type": "str",
"description": "The ticker symbol.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
]
},
@@ -19533,7 +21922,8 @@
"type": "str",
"description": "Symbol to get data for.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "provider",
@@ -19549,21 +21939,24 @@
"type": "int",
"description": "Limit the number of reports to parse, from most recent. Approximately 24 reports per year, going back to 2009.",
"default": 24,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "skip_reports",
"type": "int",
"description": "Skip N number of reports from current. A value of 1 will skip the most recent report.",
"default": 0,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "use_cache",
"type": "bool",
"description": "Whether or not to use cache for the request, default is True. Each reporting period is a separate URL, new reports will be added to the cache.",
"default": true,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -19603,42 +21996,48 @@
"type": "date",
"description": "The settlement date of the fail.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "symbol",
"type": "str",
"description": "Symbol representing the entity requested in the data.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "cusip",
"type": "str",
"description": "CUSIP of the Security.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "quantity",
"type": "int",
"description": "The number of fails on that settlement date.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "price",
"type": "float",
"description": "The price at the previous closing price from the settlement date.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "description",
"type": "str",
"description": "The description of the Security.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"sec": []
@@ -19659,21 +22058,24 @@
"type": "str",
"description": "Search query.",
"default": "",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "is_symbol",
"type": "bool",
"description": "Whether to search by ticker symbol.",
"default": false,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "use_cache",
"type": "bool",
"description": "Whether to use the cache or not.",
"default": true,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -19689,14 +22091,16 @@
"type": "bool",
"description": "When true, return companies that are actively traded (having stock prices within the past 14 days). When false, return companies that are not actively traded or never have been traded.",
"default": true,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "limit",
"type": "int",
"description": "The number of data entries to return.",
"default": 10000,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"sec": [
@@ -19705,7 +22109,8 @@
"type": "bool",
"description": "Whether to direct the search to the list of mutual funds and ETFs.",
"default": false,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -19745,14 +22150,16 @@
"type": "str",
"description": "Symbol representing the entity requested in the data.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "name",
"type": "str",
"description": "Name of the company.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"intrinio": [
@@ -19761,21 +22168,24 @@
"type": "str",
"description": "",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "lei",
"type": "str",
"description": "The Legal Entity Identifier (LEI) of the company.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "intrinio_id",
"type": "str",
"description": "The Intrinio ID of the company.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
],
"sec": [
@@ -19784,7 +22194,8 @@
"type": "str",
"description": "Central Index Key",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
]
},
@@ -19813,119 +22224,136 @@
"type": "int",
"description": "Filter by market cap greater than this value.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "mktcap_max",
"type": "int",
"description": "Filter by market cap less than this value.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "price_min",
"type": "float",
"description": "Filter by price greater than this value.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "price_max",
"type": "float",
"description": "Filter by price less than this value.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "beta_min",
"type": "float",
"description": "Filter by a beta greater than this value.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "beta_max",
"type": "float",
"description": "Filter by a beta less than this value.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "volume_min",
"type": "int",
"description": "Filter by volume greater than this value.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "volume_max",
"type": "int",
"description": "Filter by volume less than this value.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "dividend_min",
"type": "float",
"description": "Filter by dividend amount greater than this value.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "dividend_max",
"type": "float",
"description": "Filter by dividend amount less than this value.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "is_etf",
"type": "bool",
"description": "If true, returns only ETFs.",
"default": false,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "is_active",
"type": "bool",
"description": "If false, returns only inactive tickers.",
"default": true,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "sector",
"type": "Literal['Consumer Cyclical', 'Energy', 'Technology', 'Industrials', 'Financial Services', 'Basic Materials', 'Communication Services', 'Consumer Defensive', 'Healthcare', 'Real Estate', 'Utilities', 'Industrial Goods', 'Financial', 'Services', 'Conglomerates']",
"description": "Filter by sector.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "industry",
"type": "str",
"description": "Filter by industry.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "country",
"type": "str",
"description": "Filter by country, as a two-letter country code.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "exchange",
"type": "Literal['amex', 'ams', 'ase', 'asx', 'ath', 'bme', 'bru', 'bud', 'bue', 'cai', 'cnq', 'cph', 'dfm', 'doh', 'etf', 'euronext', 'hel', 'hkse', 'ice', 'iob', 'ist', 'jkt', 'jnb', 'jpx', 'kls', 'koe', 'ksc', 'kuw', 'lse', 'mex', 'mutual_fund', 'nasdaq', 'neo', 'nse', 'nyse', 'nze', 'osl', 'otc', 'pnk', 'pra', 'ris', 'sao', 'sau', 'set', 'sgo', 'shh', 'shz', 'six', 'sto', 'tai', 'tlv', 'tsx', 'two', 'vie', 'wse', 'xetra']",
"description": "Filter by exchange.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "limit",
"type": "int",
"description": "Limit the number of results to return.",
"default": 50000,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -19965,14 +22393,16 @@
"type": "str",
"description": "Symbol representing the entity requested in the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "name",
"type": "str",
"description": "Name of the company.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
],
"fmp": [
@@ -19981,84 +22411,96 @@
"type": "int",
"description": "The market cap of ticker.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "sector",
"type": "str",
"description": "The sector the ticker belongs to.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "industry",
"type": "str",
"description": "The industry ticker belongs to.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "beta",
"type": "float",
"description": "The beta of the ETF.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "price",
"type": "float",
"description": "The current price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "last_annual_dividend",
"type": "float",
"description": "The last annual amount dividend paid.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "volume",
"type": "int",
"description": "The current trading volume.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "exchange",
"type": "str",
"description": "The exchange code the asset trades on.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "exchange_name",
"type": "str",
"description": "The full name of the primary exchange.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "country",
"type": "str",
"description": "The two-letter country abbreviation where the head office is located.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "is_etf",
"type": "Literal[True, False]",
"description": "Whether the ticker is an ETF.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "actively_trading",
"type": "Literal[True, False]",
"description": "Whether the ETF is actively trading.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -20078,7 +22520,8 @@
"type": "Union[str, List[str]]",
"description": "Symbol to get data for. Multiple items allowed for provider(s): fmp, intrinio, yfinance.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "provider",
@@ -20128,266 +22571,304 @@
"type": "str",
"description": "Symbol representing the entity requested in the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "name",
"type": "str",
"description": "Common name of the company.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "cik",
"type": "str",
"description": "Central Index Key (CIK) for the requested entity.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "cusip",
"type": "str",
"description": "CUSIP identifier for the company.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "isin",
"type": "str",
"description": "International Securities Identification Number.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "lei",
"type": "str",
"description": "Legal Entity Identifier assigned to the company.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "legal_name",
"type": "str",
"description": "Official legal name of the company.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "stock_exchange",
"type": "str",
"description": "Stock exchange where the company is traded.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "sic",
"type": "int",
"description": "Standard Industrial Classification code for the company.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "short_description",
"type": "str",
"description": "Short description of the company.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "long_description",
"type": "str",
"description": "Long description of the company.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "ceo",
"type": "str",
"description": "Chief Executive Officer of the company.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "company_url",
"type": "str",
"description": "URL of the company's website.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "business_address",
"type": "str",
"description": "Address of the company's headquarters.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "mailing_address",
"type": "str",
"description": "Mailing address of the company.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "business_phone_no",
"type": "str",
"description": "Phone number of the company's headquarters.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "hq_address1",
"type": "str",
"description": "Address of the company's headquarters.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "hq_address2",
"type": "str",
"description": "Address of the company's headquarters.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "hq_address_city",
"type": "str",
"description": "City of the company's headquarters.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "hq_address_postal_code",
"type": "str",
"description": "Zip code of the company's headquarters.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "hq_state",
"type": "str",
"description": "State of the company's headquarters.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "hq_country",
"type": "str",
"description": "Country of the company's headquarters.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "inc_state",
"type": "str",
"description": "State in which the company is incorporated.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "inc_country",
"type": "str",
"description": "Country in which the company is incorporated.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "employees",
"type": "int",
"description": "Number of employees working for the company.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "entity_legal_form",
"type": "str",
"description": "Legal form of the company.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "entity_status",
"type": "str",
"description": "Status of the company.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "latest_filing_date",
"type": "date",
"description": "Date of the company's latest filing.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "irs_number",
"type": "str",
"description": "IRS number assigned to the company.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "sector",
"type": "str",
"description": "Sector in which the company operates.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "industry_category",
"type": "str",
"description": "Category of industry in which the company operates.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "industry_group",
"type": "str",
"description": "Group of industry in which the company operates.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "template",
"type": "str",
"description": "Template used to standardize the company's financial statements.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "standardized_active",
"type": "bool",
"description": "Whether the company is active or not.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "first_fundamental_date",
"type": "date",
"description": "Date of the company's first fundamental.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "last_fundamental_date",
"type": "date",
"description": "Date of the company's last fundamental.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "first_stock_price_date",
"type": "date",
"description": "Date of the company's first stock price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "last_stock_price_date",
"type": "date",
"description": "Date of the company's last stock price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"fmp": [
@@ -20396,91 +22877,104 @@
"type": "bool",
"description": "If the symbol is an ETF.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "is_actively_trading",
"type": "bool",
"description": "If the company is actively trading.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "is_adr",
"type": "bool",
"description": "If the stock is an ADR.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "is_fund",
"type": "bool",
"description": "If the company is a fund.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "image",
"type": "str",
"description": "Image of the company.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "currency",
"type": "str",
"description": "Currency in which the stock is traded.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "market_cap",
"type": "int",
"description": "Market capitalization of the company.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "last_price",
"type": "float",
"description": "The last traded price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "year_high",
"type": "float",
"description": "The one-year high of the price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "year_low",
"type": "float",
"description": "The one-year low of the price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "volume_avg",
"type": "int",
"description": "Average daily trading volume.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "annualized_dividend_amount",
"type": "float",
"description": "The annualized dividend payment based on the most recent regular dividend payment.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "beta",
"type": "float",
"description": "Beta of the stock relative to the market.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"intrinio": [
@@ -20489,14 +22983,16 @@
"type": "str",
"description": "Intrinio ID for the company.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "thea_enabled",
"type": "bool",
"description": "Whether the company has been enabled for Thea.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"yfinance": [
@@ -20505,70 +23001,80 @@
"type": "str",
"description": "The timezone of the exchange.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "issue_type",
"type": "str",
"description": "The issuance type of the asset.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "currency",
"type": "str",
"description": "The currency in which the asset is traded.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "market_cap",
"type": "int",
"description": "The market capitalization of the asset.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "shares_outstanding",
"type": "int",
"description": "The number of listed shares outstanding.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "shares_float",
"type": "int",
"description": "The number of shares in the public float.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "shares_implied_outstanding",
"type": "int",
"description": "Implied shares outstanding of common equityassuming the conversion of all convertible subsidiary equity into common.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "shares_short",
"type": "int",
"description": "The reported number of shares short.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "dividend_yield",
"type": "float",
"description": "The dividend yield of the asset, as a normalized percent.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "beta",
"type": "float",
"description": "The beta of the asset relative to the broad market.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -20597,7 +23103,8 @@
"type": "Literal['amex', 'ams', 'ase', 'asx', 'ath', 'bme', 'bru', 'bud', 'bue', 'cai', 'cnq', 'cph', 'dfm', 'doh', 'etf', 'euronext', 'hel', 'hkse', 'ice', 'iob', 'ist', 'jkt', 'jnb', 'jpx', 'kls', 'koe', 'ksc', 'kuw', 'lse', 'mex', 'mutual_fund', 'nasdaq', 'neo', 'nse', 'nyse', 'nze', 'osl', 'otc', 'pnk', 'pra', 'ris', 'sao', 'sau', 'set', 'sgo', 'shh', 'shz', 'six', 'sto', 'tai', 'tlv', 'tsx', 'two', 'vie', 'wse', 'xetra']",
"description": "The market to fetch data for.",
"default": "nasdaq",
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"intrinio": [
@@ -20606,7 +23113,8 @@
"type": "Union[Union[date, datetime, str], str]",
"description": "The date of the data. Can be a datetime or an ISO datetime string. Historical data appears to go back to mid-June 2022. Example: '2024-03-08T12:15:00+0400'",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"polygon": []
@@ -20647,63 +23155,72 @@
"type": "str",
"description": "Symbol representing the entity requested in the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "open",
"type": "float",
"description": "The open price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "high",
"type": "float",
"description": "The high price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "low",
"type": "float",
"description": "The low price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "close",
"type": "float",
"description": "The close price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "volume",
"type": "int",
"description": "The trading volume.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "prev_close",
"type": "float",
"description": "The previous close price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "change",
"type": "float",
"description": "The change in price from the previous close.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "change_percent",
"type": "float",
"description": "The change in price from the previous close, as a normalized percent.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"fmp": [
@@ -20712,98 +23229,112 @@
"type": "float",
"description": "The last price of the stock.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "last_price_timestamp",
"type": "Union[date, datetime]",
"description": "The timestamp of the last price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "ma50",
"type": "float",
"description": "The 50-day moving average.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "ma200",
"type": "float",
"description": "The 200-day moving average.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "year_high",
"type": "float",
"description": "The 52-week high.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "year_low",
"type": "float",
"description": "The 52-week low.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "volume_avg",
"type": "int",
"description": "Average daily trading volume.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "market_cap",
"type": "int",
"description": "Market cap of the stock.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "eps",
"type": "float",
"description": "Earnings per share.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "pe",
"type": "float",
"description": "Price to earnings ratio.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "shares_outstanding",
"type": "int",
"description": "Number of shares outstanding.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "name",
"type": "str",
"description": "The company name associated with the symbol.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "exchange",
"type": "str",
"description": "The exchange of the stock.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "earnings_date",
"type": "Union[date, datetime]",
"description": "The upcoming earnings announcement date.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"intrinio": [
@@ -20812,70 +23343,80 @@
"type": "float",
"description": "The last trade price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "last_size",
"type": "int",
"description": "The last trade size.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "last_volume",
"type": "int",
"description": "The last trade volume.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "last_trade_timestamp",
"type": "datetime",
"description": "The timestamp of the last trade.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "bid_size",
"type": "int",
"description": "The size of the last bid price. Bid price and size is not always available.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "bid_price",
"type": "float",
"description": "The last bid price. Bid price and size is not always available.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "ask_price",
"type": "float",
"description": "The last ask price. Ask price and size is not always available.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "ask_size",
"type": "int",
"description": "The size of the last ask price. Ask price and size is not always available.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "last_bid_timestamp",
"type": "datetime",
"description": "The timestamp of the last bid price. Bid price and size is not always available.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "last_ask_timestamp",
"type": "datetime",
"description": "The timestamp of the last ask price. Ask price and size is not always available.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"polygon": [
@@ -20884,119 +23425,136 @@
"type": "float",
"description": "The volume weighted average price of the stock on the current trading day.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "prev_open",
"type": "float",
"description": "The previous trading session opening price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "prev_high",
"type": "float",
"description": "The previous trading session high price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "prev_low",
"type": "float",
"description": "The previous trading session low price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "prev_volume",
"type": "float",
"description": "The previous trading session volume.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "prev_vwap",
"type": "float",
"description": "The previous trading session VWAP.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "last_updated",
"type": "datetime",
"description": "The last time the data was updated.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "bid",
"type": "float",
"description": "The current bid price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "bid_size",
"type": "int",
"description": "The current bid size.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "ask_size",
"type": "int",
"description": "The current ask size.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "ask",
"type": "float",
"description": "The current ask price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "quote_timestamp",
"type": "datetime",
"description": "The timestamp of the last quote.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "last_trade_price",
"type": "float",
"description": "The last trade price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "last_trade_size",
"type": "int",
"description": "The last trade size.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "last_trade_conditions",
"type": "List[int]",
"description": "The last trade condition codes.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "last_trade_exchange",
"type": "int",
"description": "The last trade exchange ID code.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "last_trade_timestamp",
"type": "datetime",
"description": "The last trade timestamp.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -21016,7 +23574,8 @@
"type": "str",
"description": "Search query.",
"default": "",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -21032,14 +23591,16 @@
"type": "Literal['AMEX', 'NYSE', 'NASDAQ', 'ETF', 'TSX', 'EURONEXT']",
"description": "The exchange code the ETF trades on.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "is_active",
"type": "Literal[True, False]",
"description": "Whether the ETF is actively trading.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"intrinio": [
@@ -21048,7 +23609,8 @@
"type": "Literal['xnas', 'arcx', 'bats', 'xnys', 'bvmf', 'xshg', 'xshe', 'xhkg', 'xbom', 'xnse', 'xidx', 'tase', 'xkrx', 'xkls', 'xmex', 'xses', 'roco', 'xtai', 'xbkk', 'xist']",
"description": "Target a specific exchange by providing the MIC code.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -21088,14 +23650,16 @@
"type": "str",
"description": "Symbol representing the entity requested in the data.(ETF)",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "name",
"type": "str",
"description": "Name of the ETF.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"fmp": [
@@ -21104,77 +23668,88 @@
"type": "float",
"description": "The market cap of the ETF.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "sector",
"type": "str",
"description": "The sector of the ETF.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "industry",
"type": "str",
"description": "The industry of the ETF.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "beta",
"type": "float",
"description": "The beta of the ETF.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "price",
"type": "float",
"description": "The current price of the ETF.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "last_annual_dividend",
"type": "float",
"description": "The last annual dividend paid.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "volume",
"type": "float",
"description": "The current trading volume of the ETF.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "exchange",
"type": "str",
"description": "The exchange code the ETF trades on.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "exchange_name",
"type": "str",
"description": "The full name of the exchange the ETF trades on.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "country",
"type": "str",
"description": "The country the ETF is registered in.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "actively_trading",
"type": "Literal[True, False]",
"description": "Whether the ETF is actively trading.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"intrinio": [
@@ -21183,42 +23758,48 @@
"type": "str",
"description": "The exchange MIC code.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "figi_ticker",
"type": "str",
"description": "The OpenFIGI ticker.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "ric",
"type": "str",
"description": "The Reuters Instrument Code.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "isin",
"type": "str",
"description": "The International Securities Identification Number.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "sedol",
"type": "str",
"description": "The Stock Exchange Daily Official List.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "intrinio_id",
"type": "str",
"description": "The unique Intrinio ID for the security.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -21238,28 +23819,32 @@
"type": "Union[str, List[str]]",
"description": "Symbol to get data for. Multiple items allowed for provider(s): fmp, polygon, tiingo, yfinance.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "interval",
"type": "str",
"description": "Time interval of the data to return.",
"default": "1d",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "start_date",
"type": "Union[date, str]",
"description": "Start date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "end_date",
"type": "Union[date, str]",
"description": "End date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -21275,7 +23860,8 @@
"type": "Literal['1m', '5m', '15m', '30m', '1h', '4h', '1d']",
"description": "Time interval of the data to return.",
"default": "1d",
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"intrinio": [
@@ -21284,42 +23870,48 @@
"type": "str",
"description": "A Security identifier (Ticker, FIGI, ISIN, CUSIP, Intrinio ID).",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "interval",
"type": "Literal['1m', '5m', '10m', '15m', '30m', '60m', '1h', '1d', '1W', '1M', '1Q', '1Y']",
"description": "Time interval of the data to return.",
"default": "1d",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "start_time",
"type": "datetime.time",
"description": "Return intervals starting at the specified time on the `start_date` formatted as 'HH:MM:SS'.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "end_time",
"type": "datetime.time",
"description": "Return intervals stopping at the specified time on the `end_date` formatted as 'HH:MM:SS'.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "timezone",
"type": "str",
"description": "Timezone of the data, in the IANA format (Continent/City).",
"default": "America/New_York",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "source",
"type": "Literal['realtime', 'delayed', 'nasdaq_basic']",
"description": "The source of the data.",
"default": "realtime",
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"polygon": [
@@ -21328,35 +23920,40 @@
"type": "str",
"description": "Time interval of the data to return. The numeric portion of the interval can be any positive integer. The letter portion can be one of the following: s, m, h, d, W, M, Q, Y",
"default": "1d",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "adjustment",
"type": "Literal['splits_only', 'unadjusted']",
"description": "The adjustment factor to apply. Default is splits only.",
"default": "splits_only",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "extended_hours",
"type": "bool",
"description": "Include Pre and Post market data.",
"default": false,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "sort",
"type": "Literal['asc', 'desc']",
"description": "Sort order of the data. This impacts the results in combination with the 'limit' parameter. The results are always returned in ascending order by date.",
"default": "asc",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "limit",
"type": "int",
"description": "The number of data entries to return.",
"default": 49999,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"tiingo": [
@@ -21365,7 +23962,8 @@
"type": "Literal['1d', '1W', '1M', '1Y']",
"description": "Time interval of the data to return.",
"default": "1d",
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"yfinance": [
@@ -21374,42 +23972,48 @@
"type": "Literal['1m', '2m', '5m', '15m', '30m', '60m', '90m', '1h', '1d', '5d', '1W', '1M', '1Q']",
"description": "Time interval of the data to return.",
"default": "1d",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "extended_hours",
"type": "bool",
"description": "Include Pre and Post market data.",
"default": false,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "include_actions",
"type": "bool",
"description": "Include dividends and stock splits in results.",
"default": true,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "adjustment",
"type": "Literal['splits_only', 'splits_and_dividends']",
"description": "The adjustment factor to apply. Default is splits only.",
"default": "splits_only",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "adjusted",
"type": "bool",
"description": "This field is deprecated (4.1.5) and will be removed in a future version. Use 'adjustment' set as 'splits_and_dividends' instead.",
"default": false,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "prepost",
"type": "bool",
"description": "This field is deprecated (4.1.5) and will be removed in a future version. Use 'extended_hours' as True instead.",
"default": false,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -21449,49 +24053,56 @@
"type": "Union[date, datetime]",
"description": "The date of the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "open",
"type": "float",
"description": "The open price.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "high",
"type": "float",
"description": "The high price.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "low",
"type": "float",
"description": "The low price.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "close",
"type": "float",
"description": "The close price.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "volume",
"type": "Union[int, float]",
"description": "The trading volume.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "vwap",
"type": "float",
"description": "Volume Weighted Average Price over the period.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"fmp": [
@@ -21500,28 +24111,32 @@
"type": "float",
"description": "The adjusted close price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "unadjusted_volume",
"type": "float",
"description": "Unadjusted volume of the symbol.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "change",
"type": "float",
"description": "Change in the price from the previous close.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "change_percent",
"type": "float",
"description": "Change in the price from the previous close, as a normalized percent.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"intrinio": [
@@ -21530,112 +24145,128 @@
"type": "float",
"description": "Average trade price of an individual equity during the interval.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "change",
"type": "float",
"description": "Change in the price of the symbol from the previous day.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "change_percent",
"type": "float",
"description": "Percent change in the price of the symbol from the previous day.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "adj_open",
"type": "float",
"description": "The adjusted open price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "adj_high",
"type": "float",
"description": "The adjusted high price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "adj_low",
"type": "float",
"description": "The adjusted low price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "adj_close",
"type": "float",
"description": "The adjusted close price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "adj_volume",
"type": "float",
"description": "The adjusted volume.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "fifty_two_week_high",
"type": "float",
"description": "52 week high price for the symbol.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "fifty_two_week_low",
"type": "float",
"description": "52 week low price for the symbol.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "factor",
"type": "float",
"description": "factor by which to multiply equity prices before this date, in order to calculate historically-adjusted equity prices.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "split_ratio",
"type": "float",
"description": "Ratio of the equity split, if a split occurred.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "dividend",
"type": "float",
"description": "Dividend amount, if a dividend was paid.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "close_time",
"type": "datetime",
"description": "The timestamp that represents the end of the interval span.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "interval",
"type": "str",
"description": "The data time frequency.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "intra_period",
"type": "bool",
"description": "If true, the equity price represents an unfinished period (be it day, week, quarter, month, or year), meaning that the close price is the latest price available, not the official close price for the period",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"polygon": [
@@ -21644,7 +24275,8 @@
"type": "Annotated[int, Gt(gt=0)]",
"description": "Number of transactions for the symbol in the time period.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"tiingo": [
@@ -21653,49 +24285,56 @@
"type": "float",
"description": "The adjusted open price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "adj_high",
"type": "float",
"description": "The adjusted high price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "adj_low",
"type": "float",
"description": "The adjusted low price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "adj_close",
"type": "float",
"description": "The adjusted close price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "adj_volume",
"type": "float",
"description": "The adjusted volume.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "split_ratio",
"type": "float",
"description": "Ratio of the equity split, if a split occurred.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "dividend",
"type": "float",
"description": "Dividend amount, if a dividend was paid.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"yfinance": [
@@ -21704,14 +24343,16 @@
"type": "float",
"description": "Ratio of the equity split, if a split occurred.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "dividend",
"type": "float",
"description": "Dividend amount (split-adjusted), if a dividend was paid.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -21731,7 +24372,8 @@
"type": "Union[str, List[str]]",
"description": "Symbol to get data for. (ETF) Multiple items allowed for provider(s): fmp, intrinio, yfinance.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "provider",
@@ -21781,28 +24423,32 @@
"type": "str",
"description": "Symbol representing the entity requested in the data. (ETF)",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "name",
"type": "str",
"description": "Name of the ETF.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "description",
"type": "str",
"description": "Description of the fund.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "inception_date",
"type": "str",
"description": "Inception date of the ETF.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
],
"fmp": [
@@ -21811,84 +24457,96 @@
"type": "str",
"description": "Company of the ETF.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "cusip",
"type": "str",
"description": "CUSIP of the ETF.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "isin",
"type": "str",
"description": "ISIN of the ETF.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "domicile",
"type": "str",
"description": "Domicile of the ETF.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "asset_class",
"type": "str",
"description": "Asset class of the ETF.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "aum",
"type": "float",
"description": "Assets under management.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "nav",
"type": "float",
"description": "Net asset value of the ETF.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "nav_currency",
"type": "str",
"description": "Currency of the ETF's net asset value.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "expense_ratio",
"type": "float",
"description": "The expense ratio, as a normalized percent.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "holdings_count",
"type": "int",
"description": "Number of holdings.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "avg_volume",
"type": "float",
"description": "Average daily trading volume.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "website",
"type": "str",
"description": "Website of the issuer.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"intrinio": [
@@ -21897,798 +24555,912 @@
"type": "date",
"description": "The date on which the Exchange Traded Product (ETP) or share class of the ETP is listed on a specific exchange.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "data_change_date",
"type": "date",
"description": "The last date on which there was a change in a classifications data field for this ETF.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "etn_maturity_date",
"type": "date",
"description": "If the product is an ETN, this field identifies the maturity date for the ETN.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "is_listed",
"type": "bool",
"description": "If true, the ETF is still listed on an exchange.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "close_date",
"type": "date",
"description": "The date on which the ETF was de-listed if it is no longer listed.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "exchange",
"type": "str",
"description": "The exchange Market Identifier Code (MIC).",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "isin",
"type": "str",
"description": "International Securities Identification Number (ISIN).",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "ric",
"type": "str",
"description": "Reuters Instrument Code (RIC).",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "sedol",
"type": "str",
"description": "Stock Exchange Daily Official List (SEDOL).",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "figi_symbol",
"type": "str",
"description": "Financial Instrument Global Identifier (FIGI) symbol.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "share_class_figi",
"type": "str",
"description": "Financial Instrument Global Identifier (FIGI).",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "firstbridge_id",
"type": "str",
"description": "The FirstBridge unique identifier for the Exchange Traded Fund (ETF).",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "firstbridge_parent_id",
"type": "str",
"description": "The FirstBridge unique identifier for the parent Exchange Traded Fund (ETF), if applicable.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "intrinio_id",
"type": "str",
"description": "Intrinio unique identifier for the security.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "intraday_nav_symbol",
"type": "str",
"description": "Intraday Net Asset Value (NAV) symbol.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "primary_symbol",
"type": "str",
"description": "The primary ticker field is used for Exchange Traded Products (ETPs) that have multiple listings and share classes. If an ETP has multiple listings or share classes, the same primary ticker is assigned to all the listings and share classes.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "etp_structure_type",
"type": "str",
"description": "Classifies Exchange Traded Products (ETPs) into very broad categories based on its legal structure.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "legal_structure",
"type": "str",
"description": "Legal structure of the fund.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "issuer",
"type": "str",
"description": "Issuer of the ETF.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "etn_issuing_bank",
"type": "str",
"description": "If the product is an Exchange Traded Note (ETN), this field identifies the issuing bank.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "fund_family",
"type": "str",
"description": "This field identifies the fund family to which the ETF belongs, as categorized by the ETF Sponsor.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "investment_style",
"type": "str",
"description": "Investment style of the ETF.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "derivatives_based",
"type": "str",
"description": "This field is populated if the ETF holds either listed or over-the-counter derivatives in its portfolio.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "income_category",
"type": "str",
"description": "Identifies if an Exchange Traded Fund (ETF) falls into a category that is specifically designed to provide a high yield or income",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "asset_class",
"type": "str",
"description": "Captures the underlying nature of the securities in the Exchanged Traded Product (ETP).",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "other_asset_types",
"type": "str",
"description": "If 'asset_class' field is classified as 'Other Asset Types' this field captures the specific category of the underlying assets.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "single_category_designation",
"type": "str",
"description": "This categorization is created for those users who want every ETF to be 'forced' into a single bucket, so that the assets for all categories will always sum to the total market.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "beta_type",
"type": "str",
"description": "This field identifies whether an ETF provides 'Traditional' beta exposure or 'Smart' beta exposure. ETFs that are active (i.e. non-indexed), leveraged / inverse or have a proprietary quant model (i.e. that don't provide indexed exposure to a targeted factor) are classified separately.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "beta_details",
"type": "str",
"description": "This field provides further detail within the traditional and smart beta categories.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "market_cap_range",
"type": "str",
"description": "Equity ETFs are classified as falling into categories based on the description of their investment strategy in the prospectus. Examples ('Mega Cap', 'Large Cap', 'Mid Cap', etc.)",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "market_cap_weighting_type",
"type": "str",
"description": "For ETFs that take the value 'Market Cap Weighted' in the 'index_weighting_scheme' field, this field provides detail on the market cap weighting type.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "index_weighting_scheme",
"type": "str",
"description": "For ETFs that track an underlying index, this field provides detail on the index weighting type.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "index_linked",
"type": "str",
"description": "This field identifies whether an ETF is index linked or active.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "index_name",
"type": "str",
"description": "This field identifies the name of the underlying index tracked by the ETF, if applicable.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "index_symbol",
"type": "str",
"description": "This field identifies the OpenFIGI ticker for the Index underlying the ETF.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "parent_index",
"type": "str",
"description": "This field identifies the name of the parent index, which represents the broader universe from which the index underlying the ETF is created, if applicable.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "index_family",
"type": "str",
"description": "This field identifies the index family to which the index underlying the ETF belongs. The index family is represented as categorized by the index provider.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "broader_index_family",
"type": "str",
"description": "This field identifies the broader index family to which the index underlying the ETF belongs. The broader index family is represented as categorized by the index provider.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "index_provider",
"type": "str",
"description": "This field identifies the Index provider for the index underlying the ETF, if applicable.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "index_provider_code",
"type": "str",
"description": "This field provides the First Bridge code for each Index provider, corresponding to the index underlying the ETF if applicable.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "replication_structure",
"type": "str",
"description": "The replication structure of the Exchange Traded Product (ETP).",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "growth_value_tilt",
"type": "str",
"description": "Classifies equity ETFs as either 'Growth' or Value' based on the stated style tilt in the ETF prospectus. Equity ETFs that do not have a stated style tilt are classified as 'Core / Blend'.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "growth_type",
"type": "str",
"description": "For ETFs that are classified as 'Growth' in 'growth_value_tilt', this field further identifies those where the stocks in the ETF are both selected and weighted based on their growth (style factor) scores.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "value_type",
"type": "str",
"description": "For ETFs that are classified as 'Value' in 'growth_value_tilt', this field further identifies those where the stocks in the ETF are both selected and weighted based on their value (style factor) scores.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "sector",
"type": "str",
"description": "For equity ETFs that aim to provide targeted exposure to a sector or industry, this field identifies the Sector that it provides the exposure to.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "industry",
"type": "str",
"description": "For equity ETFs that aim to provide targeted exposure to an industry, this field identifies the Industry that it provides the exposure to.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "industry_group",
"type": "str",
"description": "For equity ETFs that aim to provide targeted exposure to a sub-industry, this field identifies the sub-Industry that it provides the exposure to.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "cross_sector_theme",
"type": "str",
"description": "For equity ETFs that aim to provide targeted exposure to a specific investment theme that cuts across GICS sectors, this field identifies the specific cross-sector theme. Examples ('Agri-business', 'Natural Resources', 'Green Investing', etc.)",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "natural_resources_type",
"type": "str",
"description": "For ETFs that are classified as 'Natural Resources' in the 'cross_sector_theme' field, this field provides further detail on the type of Natural Resources exposure.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "us_or_excludes_us",
"type": "str",
"description": "Takes the value of 'Domestic' for US exposure, 'International' for non-US exposure and 'Global' for exposure that includes all regions including the US.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "developed_emerging",
"type": "str",
"description": "This field identifies the stage of development of the markets that the ETF provides exposure to.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "specialized_region",
"type": "str",
"description": "This field is populated if the ETF provides targeted exposure to a specific type of geography-based grouping that does not fall into a specific country or continent grouping. Examples ('BRIC', 'Chindia', etc.)",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "continent",
"type": "str",
"description": "This field is populated if the ETF provides targeted exposure to a specific continent or country within that Continent.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "latin_america_sub_group",
"type": "str",
"description": "For ETFs that are classified as 'Latin America' in the 'continent' field, this field provides further detail on the type of regional exposure.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "europe_sub_group",
"type": "str",
"description": "For ETFs that are classified as 'Europe' in the 'continent' field, this field provides further detail on the type of regional exposure.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "asia_sub_group",
"type": "str",
"description": "For ETFs that are classified as 'Asia' in the 'continent' field, this field provides further detail on the type of regional exposure.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "specific_country",
"type": "str",
"description": "This field is populated if the ETF provides targeted exposure to a specific country.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "china_listing_location",
"type": "str",
"description": "For ETFs that are classified as 'China' in the 'country' field, this field provides further detail on the type of exposure in the underlying securities.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "us_state",
"type": "str",
"description": "Takes the value of a US state if the ETF provides targeted exposure to the municipal bonds or equities of companies.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "real_estate",
"type": "str",
"description": "For ETFs that provide targeted real estate exposure, this field is populated if the ETF provides targeted exposure to a specific segment of the real estate market.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "fundamental_weighting_type",
"type": "str",
"description": "For ETFs that take the value 'Fundamental Weighted' in the 'index_weighting_scheme' field, this field provides detail on the fundamental weighting methodology.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "dividend_weighting_type",
"type": "str",
"description": "For ETFs that take the value 'Dividend Weighted' in the 'index_weighting_scheme' field, this field provides detail on the dividend weighting methodology.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "bond_type",
"type": "str",
"description": "For ETFs where 'asset_class_type' is 'Bonds', this field provides detail on the type of bonds held in the ETF.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "government_bond_types",
"type": "str",
"description": "For bond ETFs that take the value 'Treasury & Government' in 'bond_type', this field provides detail on the exposure.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "municipal_bond_region",
"type": "str",
"description": "For bond ETFs that take the value 'Municipal' in 'bond_type', this field provides additional detail on the geographic exposure.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "municipal_vrdo",
"type": "bool",
"description": "For bond ETFs that take the value 'Municipal' in 'bond_type', this field identifies those ETFs that specifically provide exposure to Variable Rate Demand Obligations.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "mortgage_bond_types",
"type": "str",
"description": "For bond ETFs that take the value 'Mortgage' in 'bond_type', this field provides additional detail on the type of underlying securities.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "bond_tax_status",
"type": "str",
"description": "For all US bond ETFs, this field provides additional detail on the tax treatment of the underlying securities.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "credit_quality",
"type": "str",
"description": "For all bond ETFs, this field helps to identify if the ETF provides targeted exposure to securities of a specific credit quality range.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "average_maturity",
"type": "str",
"description": "For all bond ETFs, this field helps to identify if the ETF provides targeted exposure to securities of a specific maturity range.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "specific_maturity_year",
"type": "int",
"description": "For all bond ETFs that take the value 'Specific Maturity Year' in the 'average_maturity' field, this field specifies the calendar year.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "commodity_types",
"type": "str",
"description": "For ETFs where 'asset_class_type' is 'Commodities', this field provides detail on the type of commodities held in the ETF.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "energy_type",
"type": "str",
"description": "For ETFs where 'commodity_type' is 'Energy', this field provides detail on the type of energy exposure provided by the ETF.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "agricultural_type",
"type": "str",
"description": "For ETFs where 'commodity_type' is 'Agricultural', this field provides detail on the type of agricultural exposure provided by the ETF.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "livestock_type",
"type": "str",
"description": "For ETFs where 'commodity_type' is 'Livestock', this field provides detail on the type of livestock exposure provided by the ETF.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "metal_type",
"type": "str",
"description": "For ETFs where 'commodity_type' is 'Gold & Metals', this field provides detail on the type of exposure provided by the ETF.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "inverse_leveraged",
"type": "str",
"description": "This field is populated if the ETF provides inverse or leveraged exposure.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "target_date_multi_asset_type",
"type": "str",
"description": "For ETFs where 'asset_class_type' is 'Target Date / MultiAsset', this field provides detail on the type of commodities held in the ETF.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "currency_pair",
"type": "str",
"description": "This field is populated if the ETF's strategy involves providing exposure to the movements of a currency or involves hedging currency exposure.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "social_environmental_type",
"type": "str",
"description": "This field is populated if the ETF's strategy involves providing exposure to a specific social or environmental theme.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "clean_energy_type",
"type": "str",
"description": "This field is populated if the ETF has a value of 'Clean Energy' in the 'social_environmental_type' field.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "dividend_type",
"type": "str",
"description": "This field is populated if the ETF has an intended investment objective of holding dividend-oriented stocks as stated in the prospectus.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "regular_dividend_payor_type",
"type": "str",
"description": "This field is populated if the ETF has a value of'Dividend - Regular Payors' in the 'dividend_type' field.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "quant_strategies_type",
"type": "str",
"description": "This field is populated if the ETF has either an index-linked or active strategy that is based on a proprietary quantitative strategy.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "other_quant_models",
"type": "str",
"description": "For ETFs where 'quant_strategies_type' is 'Other Quant Model', this field provides the name of the specific proprietary quant model used as the underlying strategy for the ETF.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "hedge_fund_type",
"type": "str",
"description": "For ETFs where 'other_asset_types' is 'Hedge Fund Replication', this field provides detail on the type of hedge fund replication strategy.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "excludes_financials",
"type": "bool",
"description": "For equity ETFs, identifies those ETFs where the underlying fund holdings will not hold financials stocks, based on the funds intended objective.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "excludes_technology",
"type": "bool",
"description": "For equity ETFs, identifies those ETFs where the underlying fund holdings will not hold technology stocks, based on the funds intended objective.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "holds_only_nyse_stocks",
"type": "bool",
"description": "If true, the ETF is an equity ETF and holds only stocks listed on NYSE.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "holds_only_nasdaq_stocks",
"type": "bool",
"description": "If true, the ETF is an equity ETF and holds only stocks listed on Nasdaq.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "holds_mlp",
"type": "bool",
"description": "If true, the ETF's investment objective explicitly specifies that it holds MLPs as an intended part of its investment strategy.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "holds_preferred_stock",
"type": "bool",
"description": "If true, the ETF's investment objective explicitly specifies that it holds preferred stock as an intended part of its investment strategy.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "holds_closed_end_funds",
"type": "bool",
"description": "If true, the ETF's investment objective explicitly specifies that it holds closed end funds as an intended part of its investment strategy.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "holds_adr",
"type": "bool",
"description": "If true, he ETF's investment objective explicitly specifies that it holds American Depositary Receipts (ADRs) as an intended part of its investment strategy.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "laddered",
"type": "bool",
"description": "For bond ETFs, this field identifies those ETFs that specifically hold bonds in a laddered structure, where the bonds are scheduled to mature in an annual, sequential structure.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "zero_coupon",
"type": "bool",
"description": "For bond ETFs, this field identifies those ETFs that specifically hold zero coupon Treasury Bills.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "floating_rate",
"type": "bool",
"description": "For bond ETFs, this field identifies those ETFs that specifically hold floating rate bonds.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "build_america_bonds",
"type": "bool",
"description": "For municipal bond ETFs, this field identifies those ETFs that specifically hold Build America Bonds.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "dynamic_futures_roll",
"type": "bool",
"description": "If the product holds futures contracts, this field identifies those products where the roll strategy is dynamic (rather than entirely rules based), so as to minimize roll costs.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "currency_hedged",
"type": "bool",
"description": "This field is populated if the ETF's strategy involves hedging currency exposure.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "includes_short_exposure",
"type": "bool",
"description": "This field is populated if the ETF has short exposure in any of its holdings e.g. in a long/short or inverse ETF.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "ucits",
"type": "bool",
"description": "If true, the Exchange Traded Product (ETP) is Undertakings for the Collective Investment in Transferable Securities (UCITS) compliant",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "registered_countries",
"type": "str",
"description": "The list of countries where the ETF is legally registered for sale. This may differ from where the ETF is domiciled or traded, particularly in Europe.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "issuer_country",
"type": "str",
"description": "2 letter ISO country code for the country where the issuer is located.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "domicile",
"type": "str",
"description": "2 letter ISO country code for the country where the ETP is domiciled.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "listing_country",
"type": "str",
"description": "2 letter ISO country code for the country of the primary listing.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "listing_region",
"type": "str",
"description": "Geographic region in the country of the primary listing falls.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "bond_currency_denomination",
"type": "str",
"description": "For all bond ETFs, this field provides additional detail on the currency denomination of the underlying securities.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "base_currency",
"type": "str",
"description": "Base currency in which NAV is reported.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "listing_currency",
"type": "str",
"description": "Listing currency of the Exchange Traded Product (ETP) in which it is traded. Reported using the 3-digit ISO currency code.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "number_of_holdings",
"type": "int",
"description": "The number of holdings in the ETF.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "month_end_assets",
"type": "float",
"description": "Net assets in millions of dollars as of the most recent month end.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "net_expense_ratio",
"type": "float",
"description": "Gross expense net of Fee Waivers, as a percentage of net assets as published by the ETF issuer.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "etf_portfolio_turnover",
"type": "float",
"description": "The percentage of positions turned over in the last 12 months.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"yfinance": [
@@ -22697,217 +25469,248 @@
"type": "str",
"description": "The legal type of fund.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "fund_family",
"type": "str",
"description": "The fund family.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "category",
"type": "str",
"description": "The fund category.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "exchange",
"type": "str",
"description": "The exchange the fund is listed on.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "exchange_timezone",
"type": "str",
"description": "The timezone of the exchange.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "currency",
"type": "str",
"description": "The currency in which the fund is listed.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "nav_price",
"type": "float",
"description": "The net asset value per unit of the fund.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "total_assets",
"type": "int",
"description": "The total value of assets held by the fund.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "trailing_pe",
"type": "float",
"description": "The trailing twelve month P/E ratio of the fund's assets.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "dividend_yield",
"type": "float",
"description": "The dividend yield of the fund, as a normalized percent.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "dividend_rate_ttm",
"type": "float",
"description": "The trailing twelve month annual dividend rate of the fund, in currency units.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "dividend_yield_ttm",
"type": "float",
"description": "The trailing twelve month annual dividend yield of the fund, as a normalized percent.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "year_high",
"type": "float",
"description": "The fifty-two week high price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "year_low",
"type": "float",
"description": "The fifty-two week low price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "ma_50d",
"type": "float",
"description": "50-day moving average price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "ma_200d",
"type": "float",
"description": "200-day moving average price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "return_ytd",
"type": "float",
"description": "The year-to-date return of the fund, as a normalized percent.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "return_3y_avg",
"type": "float",
"description": "The three year average return of the fund, as a normalized percent.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "return_5y_avg",
"type": "float",
"description": "The five year average return of the fund, as a normalized percent.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "beta_3y_avg",
"type": "float",
"description": "The three year average beta of the fund.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "volume_avg",
"type": "float",
"description": "The average daily trading volume of the fund.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "volume_avg_10d",
"type": "float",
"description": "The average daily trading volume of the fund over the past ten days.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "bid",
"type": "float",
"description": "The current bid price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "bid_size",
"type": "float",
"description": "The current bid size.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "ask",
"type": "float",
"description": "The current ask price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "ask_size",
"type": "float",
"description": "The current ask size.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "open",
"type": "float",
"description": "The open price of the most recent trading session.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "high",
"type": "float",
"description": "The highest price of the most recent trading session.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "low",
"type": "float",
"description": "The lowest price of the most recent trading session.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "volume",
"type": "int",
"description": "The trading volume of the most recent trading session.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "prev_close",
"type": "float",
"description": "The previous closing price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -22927,7 +25730,8 @@
"type": "str",
"description": "Symbol to get data for. (ETF)",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "provider",
@@ -22975,14 +25779,16 @@
"type": "str",
"description": "Sector of exposure.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "weight",
"type": "float",
"description": "Exposure of the ETF to the sector in normalized percentage points.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
],
"fmp": []
@@ -23003,7 +25809,8 @@
"type": "Union[str, List[str]]",
"description": "Symbol to get data for. (ETF) Multiple items allowed for provider(s): fmp.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "provider",
@@ -23051,7 +25858,8 @@
"type": "str",
"description": "The country of the exposure. Corresponding values are normalized percentage points.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
],
"fmp": []
@@ -23072,7 +25880,8 @@
"type": "Union[str, List[str]]",
"description": "Symbol to get data for. Multiple items allowed for provider(s): fmp, intrinio.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "provider",
@@ -23089,14 +25898,16 @@
"type": "Literal['trailing', 'calendar']",
"description": "The type of returns to return, a trailing or calendar window.",
"default": "trailing",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "adjustment",
"type": "Literal['splits_only', 'splits_and_dividends']",
"description": "The adjustment factor, 'splits_only' will return pure price performance.",
"default": "splits_and_dividends",
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -23136,119 +25947,136 @@
"type": "str",
"description": "Symbol representing the entity requested in the data.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "one_day",
"type": "float",
"description": "One-day return.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "wtd",
"type": "float",
"description": "Week to date return.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "one_week",
"type": "float",
"description": "One-week return.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "mtd",
"type": "float",
"description": "Month to date return.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "one_month",
"type": "float",
"description": "One-month return.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "qtd",
"type": "float",
"description": "Quarter to date return.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "three_month",
"type": "float",
"description": "Three-month return.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "six_month",
"type": "float",
"description": "Six-month return.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "ytd",
"type": "float",
"description": "Year to date return.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "one_year",
"type": "float",
"description": "One-year return.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "two_year",
"type": "float",
"description": "Two-year return.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "three_year",
"type": "float",
"description": "Three-year return.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "four_year",
"type": "float",
"description": "Four-year",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "five_year",
"type": "float",
"description": "Five-year return.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "ten_year",
"type": "float",
"description": "Ten-year return.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "max",
"type": "float",
"description": "Return from the beginning of the time series.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"fmp": [
@@ -23257,7 +26085,8 @@
"type": "str",
"description": "The ticker symbol.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
],
"intrinio": [
@@ -23266,105 +26095,120 @@
"type": "float",
"description": "Annualized rate of return from inception.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "volatility_one_year",
"type": "float",
"description": "Trailing one-year annualized volatility.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "volatility_three_year",
"type": "float",
"description": "Trailing three-year annualized volatility.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "volatility_five_year",
"type": "float",
"description": "Trailing five-year annualized volatility.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "volume",
"type": "int",
"description": "The trading volume.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "volume_avg_30",
"type": "float",
"description": "The one-month average daily volume.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "volume_avg_90",
"type": "float",
"description": "The three-month average daily volume.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "volume_avg_180",
"type": "float",
"description": "The six-month average daily volume.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "beta",
"type": "float",
"description": "Beta compared to the S&P 500.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "nav",
"type": "float",
"description": "Net asset value per share.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "year_high",
"type": "float",
"description": "The 52-week high price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "year_low",
"type": "float",
"description": "The 52-week low price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "market_cap",
"type": "float",
"description": "The market capitalization.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "shares_outstanding",
"type": "int",
"description": "The number of shares outstanding.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "updated",
"type": "date",
"description": "The date of the data.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -23384,7 +26228,8 @@
"type": "str",
"description": "Symbol to get data for. (ETF)",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "provider",
@@ -23400,14 +26245,16 @@
"type": "Union[Union[str, date], str]",
"description": "A specific date to get data for. Entering a date will attempt to return the NPORT-P filing for the entered date. This needs to be _exactly_ the date of the filing. Use the holdings_date command/endpoint to find available filing dates for the ETF.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "cik",
"type": "str",
"description": "The CIK of the filing entity. Overrides symbol.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"intrinio": [
@@ -23416,7 +26263,8 @@
"type": "Union[date, str]",
"description": "A specific date to get data for.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"sec": [
@@ -23425,14 +26273,16 @@
"type": "Union[Union[str, date], str]",
"description": "A specific date to get data for. The date represents the period ending. The date entered will return the closest filing.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "use_cache",
"type": "bool",
"description": "Whether or not to use cache for the request.",
"default": true,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -23472,14 +26322,16 @@
"type": "str",
"description": "Symbol representing the entity requested in the data. (ETF)",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "name",
"type": "str",
"description": "Name of the ETF holding.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"fmp": [
@@ -23488,147 +26340,168 @@
"type": "str",
"description": "The LEI of the holding.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "title",
"type": "str",
"description": "The title of the holding.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "cusip",
"type": "str",
"description": "The CUSIP of the holding.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "isin",
"type": "str",
"description": "The ISIN of the holding.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "balance",
"type": "int",
"description": "The balance of the holding, in shares or units.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "units",
"type": "Union[str, float]",
"description": "The type of units.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "currency",
"type": "str",
"description": "The currency of the holding.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "value",
"type": "float",
"description": "The value of the holding, in dollars.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "weight",
"type": "float",
"description": "The weight of the holding, as a normalized percent.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "payoff_profile",
"type": "str",
"description": "The payoff profile of the holding.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "asset_category",
"type": "str",
"description": "The asset category of the holding.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "issuer_category",
"type": "str",
"description": "The issuer category of the holding.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "country",
"type": "str",
"description": "The country of the holding.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "is_restricted",
"type": "str",
"description": "Whether the holding is restricted.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "fair_value_level",
"type": "int",
"description": "The fair value level of the holding.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "is_cash_collateral",
"type": "str",
"description": "Whether the holding is cash collateral.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "is_non_cash_collateral",
"type": "str",
"description": "Whether the holding is non-cash collateral.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "is_loan_by_fund",
"type": "str",
"description": "Whether the holding is loan by fund.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "cik",
"type": "str",
"description": "The CIK of the filing.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "acceptance_datetime",
"type": "str",
"description": "The acceptance datetime of the filing.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "updated",
"type": "Union[date, datetime]",
"description": "The date the data was updated.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"intrinio": [
@@ -23637,126 +26510,144 @@
"type": "str",
"description": "The common name for the holding.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "security_type",
"type": "str",
"description": "The type of instrument for this holding. Examples(Bond='BOND', Equity='EQUI')",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "isin",
"type": "str",
"description": "The International Securities Identification Number.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "ric",
"type": "str",
"description": "The Reuters Instrument Code.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "sedol",
"type": "str",
"description": "The Stock Exchange Daily Official List.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "share_class_figi",
"type": "str",
"description": "The OpenFIGI symbol for the holding.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "country",
"type": "str",
"description": "The country or region of the holding.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "maturity_date",
"type": "date",
"description": "The maturity date for the debt security, if available.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "contract_expiry_date",
"type": "date",
"description": "Expiry date for the futures contract held, if available.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "coupon",
"type": "float",
"description": "The coupon rate of the debt security, if available.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "balance",
"type": "Union[int, float]",
"description": "The number of units of the security held, if available.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "unit",
"type": "str",
"description": "The units of the 'balance' field.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "units_per_share",
"type": "float",
"description": "Number of units of the security held per share outstanding of the ETF, if available.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "face_value",
"type": "float",
"description": "The face value of the debt security, if available.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "derivatives_value",
"type": "float",
"description": "The notional value of derivatives contracts held.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "value",
"type": "float",
"description": "The market value of the holding, on the 'as_of' date.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "weight",
"type": "float",
"description": "The weight of the holding, as a normalized percent.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "updated",
"type": "date",
"description": "The 'as_of' date for the holding.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"sec": [
@@ -23765,511 +26656,584 @@
"type": "str",
"description": "The LEI of the holding.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "cusip",
"type": "str",
"description": "The CUSIP of the holding.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "isin",
"type": "str",
"description": "The ISIN of the holding.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "other_id",
"type": "str",
"description": "Internal identifier for the holding.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "balance",
"type": "float",
"description": "The balance of the holding.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "weight",
"type": "float",
"description": "The weight of the holding in ETF in %.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "value",
"type": "float",
"description": "The value of the holding in USD.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "payoff_profile",
"type": "str",
"description": "The payoff profile of the holding.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "units",
"type": "Union[str, float]",
"description": "The units of the holding.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "currency",
"type": "str",
"description": "The currency of the holding.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "asset_category",
"type": "str",
"description": "The asset category of the holding.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "issuer_category",
"type": "str",
"description": "The issuer category of the holding.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "country",
"type": "str",
"description": "The country of the holding.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "is_restricted",
"type": "str",
"description": "Whether the holding is restricted.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "fair_value_level",
"type": "int",
"description": "The fair value level of the holding.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "is_cash_collateral",
"type": "str",
"description": "Whether the holding is cash collateral.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "is_non_cash_collateral",
"type": "str",
"description": "Whether the holding is non-cash collateral.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "is_loan_by_fund",
"type": "str",
"description": "Whether the holding is loan by fund.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "loan_value",
"type": "float",
"description": "The loan value of the holding.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "issuer_conditional",
"type": "str",
"description": "The issuer conditions of the holding.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "asset_conditional",
"type": "str",
"description": "The asset conditions of the holding.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "maturity_date",
"type": "date",
"description": "The maturity date of the debt security.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "coupon_kind",
"type": "str",
"description": "The type of coupon for the debt security.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "rate_type",
"type": "str",
"description": "The type of rate for the debt security, floating or fixed.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "annualized_return",
"type": "float",
"description": "The annualized return on the debt security.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "is_default",
"type": "str",
"description": "If the debt security is defaulted.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "in_arrears",
"type": "str",
"description": "If the debt security is in arrears.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "is_paid_kind",
"type": "str",
"description": "If the debt security payments are paid in kind.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "derivative_category",
"type": "str",
"description": "The derivative category of the holding.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "counterparty",
"type": "str",
"description": "The counterparty of the derivative.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "underlying_name",
"type": "str",
"description": "The name of the underlying asset associated with the derivative.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "option_type",
"type": "str",
"description": "The type of option.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "derivative_payoff",
"type": "str",
"description": "The payoff profile of the derivative.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "expiry_date",
"type": "date",
"description": "The expiry or termination date of the derivative.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "exercise_price",
"type": "float",
"description": "The exercise price of the option.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "exercise_currency",
"type": "str",
"description": "The currency of the option exercise price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "shares_per_contract",
"type": "float",
"description": "The number of shares per contract.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "delta",
"type": "Union[str, float]",
"description": "The delta of the option.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "rate_type_rec",
"type": "str",
"description": "The type of rate for receivable portion of the swap.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "receive_currency",
"type": "str",
"description": "The receive currency of the swap.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "upfront_receive",
"type": "float",
"description": "The upfront amount received of the swap.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "floating_rate_index_rec",
"type": "str",
"description": "The floating rate index for receivable portion of the swap.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "floating_rate_spread_rec",
"type": "float",
"description": "The floating rate spread for reveivable portion of the swap.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "rate_tenor_rec",
"type": "str",
"description": "The rate tenor for receivable portion of the swap.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "rate_tenor_unit_rec",
"type": "Union[int, str]",
"description": "The rate tenor unit for receivable portion of the swap.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "reset_date_rec",
"type": "str",
"description": "The reset date for receivable portion of the swap.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "reset_date_unit_rec",
"type": "Union[int, str]",
"description": "The reset date unit for receivable portion of the swap.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "rate_type_pmnt",
"type": "str",
"description": "The type of rate for payment portion of the swap.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "payment_currency",
"type": "str",
"description": "The payment currency of the swap.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "upfront_payment",
"type": "float",
"description": "The upfront amount received of the swap.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "floating_rate_index_pmnt",
"type": "str",
"description": "The floating rate index for payment portion of the swap.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "floating_rate_spread_pmnt",
"type": "float",
"description": "The floating rate spread for payment portion of the swap.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "rate_tenor_pmnt",
"type": "str",
"description": "The rate tenor for payment portion of the swap.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "rate_tenor_unit_pmnt",
"type": "Union[int, str]",
"description": "The rate tenor unit for payment portion of the swap.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "reset_date_pmnt",
"type": "str",
"description": "The reset date for payment portion of the swap.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "reset_date_unit_pmnt",
"type": "Union[int, str]",
"description": "The reset date unit for payment portion of the swap.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "repo_type",
"type": "str",
"description": "The type of repo.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "is_cleared",
"type": "str",
"description": "If the repo is cleared.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "is_tri_party",
"type": "str",
"description": "If the repo is tri party.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "principal_amount",
"type": "float",
"description": "The principal amount of the repo.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "principal_currency",
"type": "str",
"description": "The currency of the principal amount.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "collateral_type",
"type": "str",
"description": "The collateral type of the repo.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "collateral_amount",
"type": "float",
"description": "The collateral amount of the repo.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "collateral_currency",
"type": "str",
"description": "The currency of the collateral amount.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "exchange_currency",
"type": "str",
"description": "The currency of the exchange rate.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "exchange_rate",
"type": "float",
"description": "The exchange rate.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "currency_sold",
"type": "str",
"description": "The currency sold in a Forward Derivative.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "currency_amount_sold",
"type": "float",
"description": "The amount of currency sold in a Forward Derivative.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "currency_bought",
"type": "str",
"description": "The currency bought in a Forward Derivative.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "currency_amount_bought",
"type": "float",
"description": "The amount of currency bought in a Forward Derivative.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "notional_amount",
"type": "float",
"description": "The notional amount of the derivative.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "notional_currency",
"type": "str",
"description": "The currency of the derivative's notional amount.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "unrealized_gain",
"type": "float",
"description": "The unrealized gain or loss on the derivative.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -24289,7 +27253,8 @@
"type": "str",
"description": "Symbol to get data for. (ETF)",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "provider",
@@ -24305,7 +27270,8 @@
"type": "str",
"description": "The CIK of the filing entity. Overrides symbol.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -24345,7 +27311,8 @@
"type": "date",
"description": "The date of the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
],
"fmp": []
@@ -24366,7 +27333,8 @@
"type": "Union[str, List[str]]",
"description": "Symbol to get data for. Multiple items allowed for provider(s): fmp.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "provider",
@@ -24414,119 +27382,136 @@
"type": "str",
"description": "Symbol representing the entity requested in the data.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "one_day",
"type": "float",
"description": "One-day return.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "wtd",
"type": "float",
"description": "Week to date return.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "one_week",
"type": "float",
"description": "One-week return.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "mtd",
"type": "float",
"description": "Month to date return.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "one_month",
"type": "float",
"description": "One-month return.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "qtd",
"type": "float",
"description": "Quarter to date return.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "three_month",
"type": "float",
"description": "Three-month return.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "six_month",
"type": "float",
"description": "Six-month return.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "ytd",
"type": "float",
"description": "Year to date return.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "one_year",
"type": "float",
"description": "One-year return.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "two_year",
"type": "float",
"description": "Two-year return.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "three_year",
"type": "float",
"description": "Three-year return.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "four_year",
"type": "float",
"description": "Four-year",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "five_year",
"type": "float",
"description": "Five-year return.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "ten_year",
"type": "float",
"description": "Ten-year return.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "max",
"type": "float",
"description": "Return from the beginning of the time series.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"fmp": [
@@ -24535,7 +27520,8 @@
"type": "str",
"description": "The ticker symbol.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
]
},
@@ -24555,7 +27541,8 @@
"type": "Union[str, List[str]]",
"description": "Symbol to get data for. (Stock) Multiple items allowed for provider(s): fmp.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "provider",
@@ -24603,35 +27590,40 @@
"type": "str",
"description": "The symbol of the equity requested.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "etf_symbol",
"type": "str",
"description": "The symbol of the ETF with exposure to the requested equity.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "shares",
"type": "float",
"description": "The number of shares held in the ETF.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "weight",
"type": "float",
"description": "The weight of the equity in the ETF, as a normalized percent.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "market_value",
"type": "Union[int, float]",
"description": "The market value of the equity position in the ETF.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"fmp": []
@@ -24652,14 +27644,16 @@
"type": "Union[date, str]",
"description": "Start date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "end_date",
"type": "Union[date, str]",
"description": "End date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -24675,7 +27669,8 @@
"type": "Literal['overnight', 'term_30', 'term_90', '1_week_term_structure', '1_month_term_structure', '3_month_term_structure', '6_month_term_structure', '1_year_term_structure', '2_year_term_structure', '30_day_ma', '90_day_ma']",
"description": "Period of AMERIBOR rate.",
"default": "overnight",
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -24715,14 +27710,16 @@
"type": "date",
"description": "The date of the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "rate",
"type": "float",
"description": "AMERIBOR rate.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
],
"fred": []
@@ -24743,14 +27740,16 @@
"type": "Union[date, str]",
"description": "Start date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "end_date",
"type": "Union[date, str]",
"description": "End date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -24766,7 +27765,8 @@
"type": "Literal['rate', 'index', '10th_percentile', '25th_percentile', '75th_percentile', '90th_percentile', 'total_nominal_value']",
"description": "Period of SONIA rate.",
"default": "rate",
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -24806,14 +27806,16 @@
"type": "date",
"description": "The date of the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "rate",
"type": "float",
"description": "SONIA rate.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
],
"fred": []
@@ -24834,14 +27836,16 @@
"type": "Union[date, str]",
"description": "Start date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "end_date",
"type": "Union[date, str]",
"description": "End date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -24889,14 +27893,16 @@
"type": "date",
"description": "The date of the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "rate",
"type": "float",
"description": "IORB rate.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
],
"fred": []
@@ -24917,14 +27923,16 @@
"type": "Union[date, str]",
"description": "Start date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "end_date",
"type": "Union[date, str]",
"description": "End date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -24941,7 +27949,8 @@
"type": "Literal['monthly', 'daily', 'weekly', 'daily_excl_weekend', 'annual', 'biweekly', 'volume']",
"description": "Period of FED rate.",
"default": "weekly",
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -24981,14 +27990,16 @@
"type": "date",
"description": "The date of the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "rate",
"type": "float",
"description": "FED rate.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
],
"federal_reserve": [],
@@ -25019,7 +28030,8 @@
"type": "bool",
"description": "Flag to show long run projections",
"default": false,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -25059,56 +28071,64 @@
"type": "date",
"description": "The date of the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "range_high",
"type": "float",
"description": "High projection of rates.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "central_tendency_high",
"type": "float",
"description": "Central tendency of high projection of rates.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "median",
"type": "float",
"description": "Median projection of rates.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "range_midpoint",
"type": "float",
"description": "Midpoint projection of rates.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "central_tendency_midpoint",
"type": "float",
"description": "Central tendency of midpoint projection of rates.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "range_low",
"type": "float",
"description": "Low projection of rates.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "central_tendency_low",
"type": "float",
"description": "Central tendency of low projection of rates.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
],
"fred": []
@@ -25129,14 +28149,16 @@
"type": "Union[date, str]",
"description": "Start date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "end_date",
"type": "Union[date, str]",
"description": "End date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -25152,7 +28174,8 @@
"type": "Literal['volume_weighted_trimmed_mean_rate', 'number_of_transactions', 'number_of_active_banks', 'total_volume', 'share_of_volume_of_the_5_largest_active_banks', 'rate_at_75th_percentile_of_volume', 'rate_at_25th_percentile_of_volume']",
"description": "Period of ESTR rate.",
"default": "volume_weighted_trimmed_mean_rate",
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -25192,14 +28215,16 @@
"type": "date",
"description": "The date of the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "rate",
"type": "float",
"description": "ESTR rate.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
],
"fred": []
@@ -25220,21 +28245,24 @@
"type": "Union[date, str]",
"description": "Start date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "end_date",
"type": "Union[date, str]",
"description": "End date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "interest_rate_type",
"type": "Literal['deposit', 'lending', 'refinancing']",
"description": "The type of interest rate.",
"default": "lending",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -25282,14 +28310,16 @@
"type": "date",
"description": "The date of the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "rate",
"type": "float",
"description": "European Central Bank Interest Rate.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
],
"fred": []
@@ -25310,14 +28340,16 @@
"type": "Union[date, str]",
"description": "Start date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "end_date",
"type": "Union[date, str]",
"description": "End date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -25333,7 +28365,8 @@
"type": "Literal['daily_excl_weekend', 'monthly', 'weekly', 'daily', 'annual']",
"description": "FRED series ID of DWPCR data.",
"default": "daily_excl_weekend",
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -25373,14 +28406,16 @@
"type": "date",
"description": "The date of the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "rate",
"type": "float",
"description": "Discount Window Primary Credit Rate.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
],
"fred": []
@@ -25401,21 +28436,24 @@
"type": "Union[date, str]",
"description": "Start date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "end_date",
"type": "Union[date, str]",
"description": "End date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "maturity",
"type": "Literal['3m', '2y']",
"description": "The maturity",
"default": "3m",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -25463,14 +28501,16 @@
"type": "date",
"description": "The date of the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "rate",
"type": "float",
"description": "TreasuryConstantMaturity Rate.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
],
"fred": []
@@ -25491,21 +28531,24 @@
"type": "Union[date, str]",
"description": "Start date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "end_date",
"type": "Union[date, str]",
"description": "End date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "maturity",
"type": "Literal['10y', '5y', '1y', '6m', '3m']",
"description": "The maturity",
"default": "10y",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -25553,14 +28596,16 @@
"type": "date",
"description": "The date of the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "rate",
"type": "float",
"description": "Selected Treasury Constant Maturity Rate.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
],
"fred": []
@@ -25581,21 +28626,24 @@
"type": "Union[date, str]",
"description": "Start date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "end_date",
"type": "Union[date, str]",
"description": "End date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "maturity",
"type": "Literal['3m', '6m']",
"description": "The maturity",
"default": "3m",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -25643,14 +28691,16 @@
"type": "date",
"description": "The date of the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "rate",
"type": "float",
"description": "SelectedTreasuryBill Rate.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
],
"fred": []
@@ -25671,14 +28721,16 @@
"type": "Union[date, str]",
"description": "A specific date to get data for. Defaults to the most recent FRED entry.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "inflation_adjusted",
"type": "bool",
"description": "Get inflation adjusted rates.",
"default": false,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -25726,14 +28778,16 @@
"type": "float",
"description": "Maturity of the treasury rate in years.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "rate",
"type": "float",
"description": "Associated rate given in decimal form (0.05 is 5%)",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
],
"fred": []
@@ -25754,14 +28808,16 @@
"type": "Union[date, str]",
"description": "Start date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "end_date",
"type": "Union[date, str]",
"description": "End date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -25810,98 +28866,112 @@
"type": "date",
"description": "The date of the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "week_4",
"type": "float",
"description": "4 week Treasury bills rate (secondary market).",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "month_1",
"type": "float",
"description": "1 month Treasury rate.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "month_2",
"type": "float",
"description": "2 month Treasury rate.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "month_3",
"type": "float",
"description": "3 month Treasury rate.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "month_6",
"type": "float",
"description": "6 month Treasury rate.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "year_1",
"type": "float",
"description": "1 year Treasury rate.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "year_2",
"type": "float",
"description": "2 year Treasury rate.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "year_3",
"type": "float",
"description": "3 year Treasury rate.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "year_5",
"type": "float",
"description": "5 year Treasury rate.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "year_7",
"type": "float",
"description": "7 year Treasury rate.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "year_10",
"type": "float",
"description": "10 year Treasury rate.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "year_20",
"type": "float",
"description": "20 year Treasury rate.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "year_30",
"type": "float",
"description": "30 year Treasury rate.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"federal_reserve": [],
@@ -25923,21 +28993,24 @@
"type": "Union[date, str]",
"description": "Start date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "end_date",
"type": "Union[date, str]",
"description": "End date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "index_type",
"type": "Literal['yield', 'yield_to_worst', 'total_return', 'spread']",
"description": "The type of series.",
"default": "yield",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -25953,28 +29026,32 @@
"type": "Literal['all', 'duration', 'eur', 'usd']",
"description": "The type of category.",
"default": "all",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "area",
"type": "Literal['asia', 'emea', 'eu', 'ex_g10', 'latin_america', 'us']",
"description": "The type of area.",
"default": "us",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "grade",
"type": "Literal['a', 'aa', 'aaa', 'b', 'bb', 'bbb', 'ccc', 'crossover', 'high_grade', 'high_yield', 'non_financial', 'non_sovereign', 'private_sector', 'public_sector']",
"description": "The type of grade.",
"default": "non_sovereign",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "options",
"type": "bool",
"description": "Whether to include options in the results.",
"default": false,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -26014,14 +29091,16 @@
"type": "date",
"description": "The date of the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "rate",
"type": "float",
"description": "ICE BofA US Corporate Bond Indices Rate.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
],
"fred": []
@@ -26042,21 +29121,24 @@
"type": "Union[date, str]",
"description": "Start date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "end_date",
"type": "Union[date, str]",
"description": "End date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "index_type",
"type": "Literal['aaa', 'baa']",
"description": "The type of series.",
"default": "aaa",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -26072,7 +29154,8 @@
"type": "Literal['treasury', 'fed_funds']",
"description": "The type of spread.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -26112,14 +29195,16 @@
"type": "date",
"description": "The date of the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "rate",
"type": "float",
"description": "Moody Corporate Bond Index Rate.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
],
"fred": []
@@ -26140,14 +29225,16 @@
"type": "Union[date, str]",
"description": "A specific date to get data for.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "yield_curve",
"type": "Literal['spot', 'par']",
"description": "The yield curve type.",
"default": "spot",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -26195,28 +29282,32 @@
"type": "date",
"description": "The date of the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "rate",
"type": "float",
"description": "HighQualityMarketCorporateBond Rate.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "maturity",
"type": "str",
"description": "Maturity.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "yield_curve",
"type": "Literal['spot', 'par']",
"description": "The yield curve type.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
],
"fred": [
@@ -26225,7 +29316,8 @@
"type": "str",
"description": "FRED series id.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
]
},
@@ -26245,28 +29337,35 @@
"type": "Union[date, str]",
"description": "Start date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "end_date",
"type": "Union[date, str]",
"description": "End date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "maturity",
"type": "Union[Union[float, str], List[Union[float, str]]]",
"description": "Maturities in years. Multiple items allowed for provider(s): fred.",
"default": 10.0,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "category",
"type": "Union[str, List[str]]",
"description": "Rate category. Options: spot_rate, par_yield. Multiple items allowed for provider(s): fred.",
"default": "spot_rate",
- "optional": true
+ "optional": true,
+ "choices": [
+ "par_yield",
+ "spot_rate"
+ ]
},
{
"name": "provider",
@@ -26314,14 +29413,16 @@
"type": "date",
"description": "The date of the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "rate",
"type": "float",
"description": "Spot Rate.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
],
"fred": []
@@ -26342,35 +29443,40 @@
"type": "Union[date, str]",
"description": "Start date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "end_date",
"type": "Union[date, str]",
"description": "End date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "maturity",
"type": "Literal['overnight', '7d', '15d', '30d', '60d', '90d']",
"description": "The maturity.",
"default": "30d",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "category",
"type": "Literal['asset_backed', 'financial', 'nonfinancial']",
"description": "The category.",
"default": "financial",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "grade",
"type": "Literal['aa', 'a2_p2']",
"description": "The grade.",
"default": "aa",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -26418,14 +29524,16 @@
"type": "date",
"description": "The date of the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "rate",
"type": "float",
"description": "Commercial Paper Rate.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
],
"fred": []
@@ -26446,14 +29554,16 @@
"type": "Union[date, str]",
"description": "Start date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "end_date",
"type": "Union[date, str]",
"description": "End date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -26469,7 +29579,8 @@
"type": "Literal['overnight', '30_day', '90_day', '180_day', 'index']",
"description": "Period of SOFR rate.",
"default": "overnight",
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -26509,14 +29620,16 @@
"type": "date",
"description": "The date of the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "rate",
"type": "float",
"description": "SOFR rate.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
],
"fred": []
@@ -26537,28 +29650,32 @@
"type": "Union[str, List[str]]",
"description": "Symbol to get data for. Multiple items allowed for provider(s): fmp, intrinio, polygon, yfinance.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "start_date",
"type": "Union[date, str]",
"description": "Start date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "end_date",
"type": "Union[date, str]",
"description": "End date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "interval",
"type": "str",
"description": "Time interval of the data to return.",
"default": "1d",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -26574,7 +29691,8 @@
"type": "Literal['1m', '5m', '15m', '30m', '1h', '4h', '1d']",
"description": "Time interval of the data to return.",
"default": "1d",
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"intrinio": [
@@ -26583,7 +29701,8 @@
"type": "int",
"description": "The number of data entries to return.",
"default": 10000,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"polygon": [
@@ -26592,21 +29711,24 @@
"type": "str",
"description": "Time interval of the data to return. The numeric portion of the interval can be any positive integer. The letter portion can be one of the following: s, m, h, d, W, M, Q, Y",
"default": "1d",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "sort",
"type": "Literal['asc', 'desc']",
"description": "Sort order of the data. This impacts the results in combination with the 'limit' parameter. The results are always returned in ascending order by date.",
"default": "asc",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "limit",
"type": "int",
"description": "The number of data entries to return.",
"default": 49999,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"yfinance": [
@@ -26615,7 +29737,8 @@
"type": "Literal['1m', '2m', '5m', '15m', '30m', '60m', '90m', '1h', '1d', '5d', '1W', '1M', '1Q']",
"description": "Time interval of the data to return.",
"default": "1d",
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -26655,42 +29778,48 @@
"type": "Union[date, datetime]",
"description": "The date of the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "open",
"type": "Annotated[float, Strict(strict=True)]",
"description": "The open price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "high",
"type": "Annotated[float, Strict(strict=True)]",
"description": "The high price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "low",
"type": "Annotated[float, Strict(strict=True)]",
"description": "The low price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "close",
"type": "Annotated[float, Strict(strict=True)]",
"description": "The close price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "volume",
"type": "int",
"description": "The trading volume.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"fmp": [
@@ -26699,21 +29828,24 @@
"type": "float",
"description": "Volume Weighted Average Price over the period.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "change",
"type": "float",
"description": "Change in the price from the previous close.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "change_percent",
"type": "float",
"description": "Change in the price from the previous close, as a normalized percent.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"intrinio": [],
@@ -26723,7 +29855,8 @@
"type": "Annotated[int, Gt(gt=0)]",
"description": "Number of transactions for the symbol in the time period.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"yfinance": []
@@ -26744,28 +29877,32 @@
"type": "Union[str, List[str]]",
"description": "Symbol to get data for. Multiple items allowed for provider(s): fmp, intrinio, polygon, yfinance.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "start_date",
"type": "Union[date, str]",
"description": "Start date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "end_date",
"type": "Union[date, str]",
"description": "End date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "interval",
"type": "str",
"description": "Time interval of the data to return.",
"default": "1d",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -26781,7 +29918,8 @@
"type": "Literal['1m', '5m', '15m', '30m', '1h', '4h', '1d']",
"description": "Time interval of the data to return.",
"default": "1d",
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"intrinio": [
@@ -26790,7 +29928,8 @@
"type": "int",
"description": "The number of data entries to return.",
"default": 10000,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"polygon": [
@@ -26799,21 +29938,24 @@
"type": "str",
"description": "Time interval of the data to return. The numeric portion of the interval can be any positive integer. The letter portion can be one of the following: s, m, h, d, W, M, Q, Y",
"default": "1d",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "sort",
"type": "Literal['asc', 'desc']",
"description": "Sort order of the data. This impacts the results in combination with the 'limit' parameter. The results are always returned in ascending order by date.",
"default": "asc",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "limit",
"type": "int",
"description": "The number of data entries to return.",
"default": 49999,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"yfinance": [
@@ -26822,7 +29964,8 @@
"type": "Literal['1m', '2m', '5m', '15m', '30m', '60m', '90m', '1h', '1d', '5d', '1W', '1M', '1Q']",
"description": "Time interval of the data to return.",
"default": "1d",
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -26862,42 +30005,48 @@
"type": "Union[date, datetime]",
"description": "The date of the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "open",
"type": "Annotated[float, Strict(strict=True)]",
"description": "The open price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "high",
"type": "Annotated[float, Strict(strict=True)]",
"description": "The high price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "low",
"type": "Annotated[float, Strict(strict=True)]",
"description": "The low price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "close",
"type": "Annotated[float, Strict(strict=True)]",
"description": "The close price.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "volume",
"type": "int",
"description": "The trading volume.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"fmp": [
@@ -26906,21 +30055,24 @@
"type": "float",
"description": "Volume Weighted Average Price over the period.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "change",
"type": "float",
"description": "Change in the price from the previous close.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "change_percent",
"type": "float",
"description": "Change in the price from the previous close, as a normalized percent.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"intrinio": [],
@@ -26930,7 +30082,8 @@
"type": "Annotated[int, Gt(gt=0)]",
"description": "Number of transactions for the symbol in the time period.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"yfinance": []
@@ -26951,7 +30104,8 @@
"type": "str",
"description": "Symbol to get data for.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "provider",
@@ -26967,7 +30121,8 @@
"type": "Literal['dowjones', 'sp500', 'nasdaq']",
"description": "None",
"default": "dowjones",
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -27007,14 +30162,16 @@
"type": "str",
"description": "Symbol representing the entity requested in the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "name",
"type": "str",
"description": "Name of the constituent company in the index.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"fmp": [
@@ -27023,42 +30180,48 @@
"type": "str",
"description": "Sector the constituent company in the index belongs to.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "sub_sector",
"type": "str",
"description": "Sub-sector the constituent company in the index belongs to.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "headquarter",
"type": "str",
"description": "Location of the headquarter of the constituent company in the index.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "date_first_added",
"type": "Union[str, date]",
"description": "Date the constituent company was added to the index.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "cik",
"type": "int",
"description": "Central Index Key (CIK) for the requested entity.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "founded",
"type": "Union[str, date]",
"description": "Founding year of the constituent company in the index.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -27120,14 +30283,16 @@
"type": "str",
"description": "Name of the index.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "currency",
"type": "str",
"description": "Currency the index is traded in.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"fmp": [
@@ -27136,14 +30301,16 @@
"type": "str",
"description": "Stock exchange where the index is listed.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "exchange_short_name",
"type": "str",
"description": "Short name of the stock exchange where the index is listed.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
],
"yfinance": [
@@ -27152,14 +30319,16 @@
"type": "str",
"description": "ID code for keying the index in the OpenBB Terminal.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "symbol",
"type": "str",
"description": "Symbol for the index.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
]
},
@@ -27179,21 +30348,24 @@
"type": "int",
"description": "The number of data entries to return. The number of articles to return.",
"default": 2500,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "start_date",
"type": "Union[date, str]",
"description": "Start date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "end_date",
"type": "Union[date, str]",
"description": "End date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -27209,84 +30381,96 @@
"type": "Union[date, str]",
"description": "A specific date to get data for.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "display",
"type": "Literal['headline', 'abstract', 'full']",
"description": "Specify headline only (headline), headline + teaser (abstract), or headline + full body (full).",
"default": "full",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "updated_since",
"type": "int",
"description": "Number of seconds since the news was updated.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "published_since",
"type": "int",
"description": "Number of seconds since the news was published.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "sort",
"type": "Literal['id', 'created', 'updated']",
"description": "Key to sort the news by.",
"default": "created",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "order",
"type": "Literal['asc', 'desc']",
"description": "Order to sort the news by.",
"default": "desc",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "isin",
"type": "str",
"description": "The ISIN of the news to retrieve.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "cusip",
"type": "str",
"description": "The CUSIP of the news to retrieve.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "channels",
"type": "str",
"description": "Channels of the news to retrieve.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "topics",
"type": "str",
"description": "Topics of the news to retrieve.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "authors",
"type": "str",
"description": "Authors of the news to retrieve.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "content_types",
"type": "str",
"description": "Content types of the news to retrieve.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"fmp": [],
@@ -27296,63 +30480,72 @@
"type": "Literal['yahoo', 'moody', 'moody_us_news', 'moody_us_press_releases']",
"description": "The source of the news article.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "sentiment",
"type": "Literal['positive', 'neutral', 'negative']",
"description": "Return news only from this source.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "language",
"type": "str",
"description": "Filter by language. Unsupported for yahoo source.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "topic",
"type": "str",
"description": "Filter by topic. Unsupported for yahoo source.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "word_count_greater_than",
"type": "int",
"description": "News stories will have a word count greater than this value. Unsupported for yahoo source.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "word_count_less_than",
"type": "int",
"description": "News stories will have a word count less than this value. Unsupported for yahoo source.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "is_spam",
"type": "bool",
"description": "Filter whether it is marked as spam or not. Unsupported for yahoo source.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "business_relevance_greater_than",
"type": "float",
"description": "News stories will have a business relevance score more than this value. Unsupported for yahoo source.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "business_relevance_less_than",
"type": "float",
"description": "News stories will have a business relevance score less than this value. Unsupported for yahoo source.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"tiingo": [
@@ -27361,14 +30554,16 @@
"type": "int",
"description": "Page offset, used in conjunction with limit.",
"default": 0,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "source",
"type": "str",
"description": "A comma-separated list of the domains requested.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -27408,35 +30603,40 @@
"type": "datetime",
"description": "The date of the data. The published date of the article.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "title",
"type": "str",
"description": "Title of the article.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "images",
"type": "List[Dict[str, str]]",
"description": "Images associated with the article.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "text",
"type": "str",
"description": "Text/body of the article.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "url",
"type": "str",
"description": "URL to the article.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"benzinga": [
@@ -27445,49 +30645,56 @@
"type": "str",
"description": "Article ID.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "author",
"type": "str",
"description": "Author of the news.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "teaser",
"type": "str",
"description": "Teaser of the news.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "channels",
"type": "str",
"description": "Channels associated with the news.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "stocks",
"type": "str",
"description": "Stocks associated with the news.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "tags",
"type": "str",
"description": "Tags associated with the news.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "updated",
"type": "datetime",
"description": "Updated date of the news.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"fmp": [
@@ -27496,7 +30703,8 @@
"type": "str",
"description": "News source.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
],
"intrinio": [
@@ -27505,91 +30713,104 @@
"type": "str",
"description": "The source of the news article.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "summary",
"type": "str",
"description": "The summary of the news article.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "topics",
"type": "str",
"description": "The topics related to the news article.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "word_count",
"type": "int",
"description": "The word count of the news article.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "business_relevance",
"type": "float",
"description": "How strongly correlated the news article is to the business",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "sentiment",
"type": "str",
"description": "The sentiment of the news article - i.e, negative, positive.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "sentiment_confidence",
"type": "float",
"description": "The confidence score of the sentiment rating.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "language",
"type": "str",
"description": "The language of the news article.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "spam",
"type": "bool",
"description": "Whether the news article is spam.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "copyright",
"type": "str",
"description": "The copyright notice of the news article.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "id",
"type": "str",
"description": "Article ID.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "company",
"type": "IntrinioCompany",
"description": "The Intrinio Company object. Contains details company reference data.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "security",
"type": "IntrinioSecurity",
"description": "The Intrinio Security object. Contains the security details related to the news article.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"tiingo": [
@@ -27598,35 +30819,40 @@
"type": "str",
"description": "Ticker tagged in the fetched news.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "article_id",
"type": "int",
"description": "Unique ID of the news article.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "site",
"type": "str",
"description": "News source.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "tags",
"type": "str",
"description": "Tags associated with the news article.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "crawl_date",
"type": "datetime",
"description": "Date the news article was crawled.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
]
},
@@ -27646,28 +30872,32 @@
"type": "Union[str, List[str]]",
"description": "Symbol to get data for. Multiple items allowed for provider(s): benzinga, fmp, intrinio, polygon, tiingo, yfinance.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "start_date",
"type": "Union[date, str]",
"description": "Start date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "end_date",
"type": "Union[date, str]",
"description": "End date of the data, in YYYY-MM-DD format.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "limit",
"type": "Annotated[int, Ge(ge=0)]",
"description": "The number of data entries to return.",
"default": 2500,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -27683,84 +30913,96 @@
"type": "Union[date, str]",
"description": "A specific date to get data for.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "display",
"type": "Literal['headline', 'abstract', 'full']",
"description": "Specify headline only (headline), headline + teaser (abstract), or headline + full body (full).",
"default": "full",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "updated_since",
"type": "int",
"description": "Number of seconds since the news was updated.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "published_since",
"type": "int",
"description": "Number of seconds since the news was published.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "sort",
"type": "Literal['id', 'created', 'updated']",
"description": "Key to sort the news by.",
"default": "created",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "order",
"type": "Literal['asc', 'desc']",
"description": "Order to sort the news by.",
"default": "desc",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "isin",
"type": "str",
"description": "The company's ISIN.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "cusip",
"type": "str",
"description": "The company's CUSIP.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "channels",
"type": "str",
"description": "Channels of the news to retrieve.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "topics",
"type": "str",
"description": "Topics of the news to retrieve.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "authors",
"type": "str",
"description": "Authors of the news to retrieve.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "content_types",
"type": "str",
"description": "Content types of the news to retrieve.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"fmp": [
@@ -27769,7 +31011,8 @@
"type": "int",
"description": "Page number of the results. Use in combination with limit.",
"default": 0,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"intrinio": [
@@ -27778,63 +31021,72 @@
"type": "Literal['yahoo', 'moody', 'moody_us_news', 'moody_us_press_releases']",
"description": "The source of the news article.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "sentiment",
"type": "Literal['positive', 'neutral', 'negative']",
"description": "Return news only from this source.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "language",
"type": "str",
"description": "Filter by language. Unsupported for yahoo source.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "topic",
"type": "str",
"description": "Filter by topic. Unsupported for yahoo source.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "word_count_greater_than",
"type": "int",
"description": "News stories will have a word count greater than this value. Unsupported for yahoo source.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "word_count_less_than",
"type": "int",
"description": "News stories will have a word count less than this value. Unsupported for yahoo source.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "is_spam",
"type": "bool",
"description": "Filter whether it is marked as spam or not. Unsupported for yahoo source.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "business_relevance_greater_than",
"type": "float",
"description": "News stories will have a business relevance score more than this value. Unsupported for yahoo source.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "business_relevance_less_than",
"type": "float",
"description": "News stories will have a business relevance score less than this value. Unsupported for yahoo source.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"polygon": [
@@ -27843,7 +31095,8 @@
"type": "Literal['asc', 'desc']",
"description": "Sort order of the articles.",
"default": "desc",
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"tiingo": [
@@ -27852,14 +31105,16 @@
"type": "int",
"description": "Page offset, used in conjunction with limit.",
"default": 0,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "source",
"type": "str",
"description": "A comma-separated list of the domains requested.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"yfinance": []
@@ -27900,42 +31155,48 @@
"type": "datetime",
"description": "The date of the data. Here it is the published date of the article.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "title",
"type": "str",
"description": "Title of the article.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "text",
"type": "str",
"description": "Text/body of the article.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "images",
"type": "List[Dict[str, str]]",
"description": "Images associated with the article.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "url",
"type": "str",
"description": "URL to the article.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "symbols",
"type": "str",
"description": "Symbols associated with the article.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"benzinga": [
@@ -27944,56 +31205,64 @@
"type": "List[Dict[str, str]]",
"description": "URL to the images of the news.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "id",
"type": "str",
"description": "Article ID.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "author",
"type": "str",
"description": "Author of the article.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "teaser",
"type": "str",
"description": "Teaser of the news.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "channels",
"type": "str",
"description": "Channels associated with the news.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "stocks",
"type": "str",
"description": "Stocks associated with the news.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "tags",
"type": "str",
"description": "Tags associated with the news.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "updated",
"type": "datetime",
"description": "Updated date of the news.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"fmp": [
@@ -28002,7 +31271,8 @@
"type": "str",
"description": "Name of the news source.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
],
"intrinio": [
@@ -28011,84 +31281,96 @@
"type": "str",
"description": "The source of the news article.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "summary",
"type": "str",
"description": "The summary of the news article.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "topics",
"type": "str",
"description": "The topics related to the news article.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "word_count",
"type": "int",
"description": "The word count of the news article.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "business_relevance",
"type": "float",
"description": "How strongly correlated the news article is to the business",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "sentiment",
"type": "str",
"description": "The sentiment of the news article - i.e, negative, positive.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "sentiment_confidence",
"type": "float",
"description": "The confidence score of the sentiment rating.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "language",
"type": "str",
"description": "The language of the news article.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "spam",
"type": "bool",
"description": "Whether the news article is spam.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "copyright",
"type": "str",
"description": "The copyright notice of the news article.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "id",
"type": "str",
"description": "Article ID.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "security",
"type": "IntrinioSecurity",
"description": "The Intrinio Security object. Contains the security details related to the news article.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"polygon": [
@@ -28097,35 +31379,40 @@
"type": "str",
"description": "Source of the article.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "tags",
"type": "str",
"description": "Keywords/tags in the article",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "id",
"type": "str",
"description": "Article ID.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "amp_url",
"type": "str",
"description": "AMP URL.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "publisher",
"type": "PolygonPublisher",
"description": "Publisher of the article.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
],
"tiingo": [
@@ -28134,28 +31421,32 @@
"type": "str",
"description": "Tags associated with the news article.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "article_id",
"type": "int",
"description": "Unique ID of the news article.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "source",
"type": "str",
"description": "News source.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "crawl_date",
"type": "datetime",
"description": "Date the news article was crawled.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
],
"yfinance": [
@@ -28164,7 +31455,8 @@
"type": "str",
"description": "Source of the news article",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
]
},
@@ -28184,7 +31476,8 @@
"type": "str",
"description": "Symbol to get data for.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "provider",
@@ -28200,7 +31493,8 @@
"type": "bool",
"description": "Whether or not to use cache for the request, default is True.",
"default": true,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -28240,7 +31534,8 @@
"type": "Union[int, str]",
"description": "Central Index Key (CIK) for the requested entity.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
],
"sec": []
@@ -28261,14 +31556,16 @@
"type": "str",
"description": "Search query.",
"default": "",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "use_cache",
"type": "bool",
"description": "Whether or not to use cache.",
"default": true,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -28317,14 +31614,16 @@
"type": "str",
"description": "The name of the institution.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "cik",
"type": "Union[int, str]",
"description": "Central Index Key (CIK)",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -28344,14 +31643,16 @@
"type": "str",
"description": "Search query.",
"default": "",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "use_cache",
"type": "bool",
"description": "Whether or not to use cache.",
"default": true,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -28367,7 +31668,8 @@
"type": "str",
"description": "Enter an optional URL path to fetch the next level.",
"default": null,
- "optional": true
+ "optional": true,
+ "choices": null
}
]
},
@@ -28408,7 +31710,8 @@
"type": "List[str]",
"description": "Dictionary of URLs to SEC Schema Files",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
]
},
@@ -28428,14 +31731,16 @@
"type": "str",
"description": "Search query.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "use_cache",
"type": "bool",
"description": "Whether or not to use cache. If True, cache will store for seven days.",
"default": true,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -28484,7 +31789,8 @@
"type": "str",
"description": "Symbol representing the entity requested in the data.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
]
},
@@ -28546,35 +31852,40 @@
"type": "datetime",
"description": "The date of publication.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "title",
"type": "str",
"description": "The title of the release.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "summary",
"type": "str",
"description": "Short summary of the release.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "id",
"type": "str",
"description": "The identifier associated with the release.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "link",
"type": "str",
"description": "URL to the release.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
]
},
@@ -28594,14 +31905,16 @@
"type": "str",
"description": "Search query.",
"default": "",
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "use_cache",
"type": "bool",
"description": "Whether or not to use cache.",
"default": true,
- "optional": true
+ "optional": true,
+ "choices": null
},
{
"name": "provider",
@@ -28650,21 +31963,24 @@
"type": "int",
"description": "Sector Industrial Code (SIC)",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "industry",
"type": "str",
"description": "Industry title.",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
},
{
"name": "office",
"type": "str",
"description": "Reporting office within the Corporate Finance Office",
"default": "",
- "optional": false
+ "optional": false,
+ "choices": null
}
]
},
From 07693784fb4222c3c174e8004876daad40787ee6 Mon Sep 17 00:00:00 2001
From: montezdesousa <79287829+montezdesousa@users.noreply.github.com>
Date: Tue, 14 May 2024 14:19:23 +0100
Subject: [PATCH 07/13] [BugFix] - Replace python-jose by PyJWT (#6407)
* fix: replace python-jose by PyJWT
* add unit test
* add unit test
---------
Co-authored-by: Theodore Aptekarev
---
.../openbb_core/app/service/hub_service.py | 10 +--
openbb_platform/core/poetry.lock | 84 ++++---------------
openbb_platform/core/pyproject.toml | 2 +-
.../tests/app/service/test_hub_service.py | 34 ++++++++
4 files changed, 57 insertions(+), 73 deletions(-)
diff --git a/openbb_platform/core/openbb_core/app/service/hub_service.py b/openbb_platform/core/openbb_core/app/service/hub_service.py
index 419eef955dd1..3448eb8d52cb 100644
--- a/openbb_platform/core/openbb_core/app/service/hub_service.py
+++ b/openbb_platform/core/openbb_core/app/service/hub_service.py
@@ -4,9 +4,7 @@
from warnings import warn
from fastapi import HTTPException
-from jose import JWTError
-from jose.exceptions import ExpiredSignatureError
-from jose.jwt import decode, get_unverified_header
+from jwt import ExpiredSignatureError, PyJWTError, decode, get_unverified_header
from openbb_core.app.model.abstract.error import OpenBBError
from openbb_core.app.model.credentials import Credentials
from openbb_core.app.model.hub.hub_session import HubSession
@@ -139,7 +137,7 @@ def _get_session_from_platform_token(self, token: str) -> HubSession:
if not token:
raise OpenBBError("Platform personal access token not found.")
- self.check_token_expiration(token)
+ self._check_token_expiration(token)
response = post(
url=self._base_url + "/sdk/login",
@@ -259,7 +257,7 @@ def platform2hub(self, credentials: Credentials) -> HubUserSettings:
return settings
@staticmethod
- def check_token_expiration(token: str) -> None:
+ def _check_token_expiration(token: str) -> None:
"""Check token expiration, raises exception if expired."""
try:
header_data = get_unverified_header(token)
@@ -271,5 +269,5 @@ def check_token_expiration(token: str) -> None:
)
except ExpiredSignatureError as e:
raise OpenBBError("Platform personal access token expired.") from e
- except JWTError as e:
+ except PyJWTError as e:
raise OpenBBError("Failed to decode Platform token.") from e
diff --git a/openbb_platform/core/poetry.lock b/openbb_platform/core/poetry.lock
index 80094cd46e13..44a2f785be91 100644
--- a/openbb_platform/core/poetry.lock
+++ b/openbb_platform/core/poetry.lock
@@ -321,24 +321,6 @@ files = [
{file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"},
]
-[[package]]
-name = "ecdsa"
-version = "0.18.0"
-description = "ECDSA cryptographic signature library (pure python)"
-optional = false
-python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
-files = [
- {file = "ecdsa-0.18.0-py2.py3-none-any.whl", hash = "sha256:80600258e7ed2f16b9aa1d7c295bd70194109ad5a30fdee0eaeefef1d4c559dd"},
- {file = "ecdsa-0.18.0.tar.gz", hash = "sha256:190348041559e21b22a1d65cee485282ca11a6f81d503fddb84d5017e9ed1e49"},
-]
-
-[package.dependencies]
-six = ">=1.9.0"
-
-[package.extras]
-gmpy = ["gmpy"]
-gmpy2 = ["gmpy2"]
-
[[package]]
name = "exceptiongroup"
version = "1.2.0"
@@ -840,17 +822,6 @@ dev = ["black", "flake8", "flake8-print", "isort", "pre-commit"]
sentry = ["django", "sentry-sdk"]
test = ["coverage", "flake8", "freezegun (==0.3.15)", "mock (>=2.0.0)", "pylint", "pytest", "pytest-timeout"]
-[[package]]
-name = "pyasn1"
-version = "0.5.1"
-description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)"
-optional = false
-python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7"
-files = [
- {file = "pyasn1-0.5.1-py2.py3-none-any.whl", hash = "sha256:4439847c58d40b1d0a573d07e3856e95333f1976294494c325775aeca506eb58"},
- {file = "pyasn1-0.5.1.tar.gz", hash = "sha256:6d391a96e59b23130a5cfa74d6fd7f388dbbe26cc8f1edf39fdddf08d9d6676c"},
-]
-
[[package]]
name = "pydantic"
version = "2.6.4"
@@ -961,6 +932,23 @@ files = [
[package.dependencies]
typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0"
+[[package]]
+name = "pyjwt"
+version = "2.8.0"
+description = "JSON Web Token implementation in Python"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "PyJWT-2.8.0-py3-none-any.whl", hash = "sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320"},
+ {file = "PyJWT-2.8.0.tar.gz", hash = "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de"},
+]
+
+[package.extras]
+crypto = ["cryptography (>=3.4.0)"]
+dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"]
+docs = ["sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"]
+tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"]
+
[[package]]
name = "pytest"
version = "7.4.4"
@@ -1059,27 +1047,6 @@ files = [
[package.extras]
cli = ["click (>=5.0)"]
-[[package]]
-name = "python-jose"
-version = "3.3.0"
-description = "JOSE implementation in Python"
-optional = false
-python-versions = "*"
-files = [
- {file = "python-jose-3.3.0.tar.gz", hash = "sha256:55779b5e6ad599c6336191246e95eb2293a9ddebd555f796a65f838f07e5d78a"},
- {file = "python_jose-3.3.0-py2.py3-none-any.whl", hash = "sha256:9b1376b023f8b298536eedd47ae1089bcdb848f1535ab30555cd92002d78923a"},
-]
-
-[package.dependencies]
-ecdsa = "!=0.15"
-pyasn1 = "*"
-rsa = "*"
-
-[package.extras]
-cryptography = ["cryptography (>=3.4.0)"]
-pycrypto = ["pyasn1", "pycrypto (>=2.6.0,<2.7.0)"]
-pycryptodome = ["pyasn1", "pycryptodome (>=3.3.1,<4.0.0)"]
-
[[package]]
name = "python-multipart"
version = "0.0.7"
@@ -1130,7 +1097,6 @@ files = [
{file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"},
{file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"},
{file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"},
- {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"},
{file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"},
{file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"},
{file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"},
@@ -1186,20 +1152,6 @@ urllib3 = ">=1.21.1,<3"
socks = ["PySocks (>=1.5.6,!=1.5.7)"]
use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"]
-[[package]]
-name = "rsa"
-version = "4.9"
-description = "Pure-Python RSA implementation"
-optional = false
-python-versions = ">=3.6,<4"
-files = [
- {file = "rsa-4.9-py3-none-any.whl", hash = "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7"},
- {file = "rsa-4.9.tar.gz", hash = "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21"},
-]
-
-[package.dependencies]
-pyasn1 = ">=0.1.3"
-
[[package]]
name = "ruff"
version = "0.1.15"
@@ -1722,4 +1674,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p
[metadata]
lock-version = "2.0"
python-versions = "^3.8"
-content-hash = "c58b1fc15e472b1609a4194d44da6cd35fc78748cd0931a874bebf441fe8c8ba"
+content-hash = "3431ad81cc2788032dfa6b3b7b12d705da384ecc9c592c7663da3d36d885e021"
diff --git a/openbb_platform/core/pyproject.toml b/openbb_platform/core/pyproject.toml
index 2f6467930f7d..4832836ca77c 100644
--- a/openbb_platform/core/pyproject.toml
+++ b/openbb_platform/core/pyproject.toml
@@ -13,7 +13,6 @@ websockets = "^12.0"
pandas = ">=1.5.3"
html5lib = "^1.1"
fastapi = "^0.104.1"
-python-jose = "^3.3.0"
uuid7 = "^0.1.0"
posthog = "^3.3.1"
python-multipart = "^0.0.7"
@@ -23,6 +22,7 @@ importlib-metadata = "^6.8.0"
python-dotenv = "^1.0.0"
aiohttp = "^3.9.5"
ruff = "^0.1.6"
+pyjwt = "^2.8.0"
[tool.poetry.group.dev.dependencies]
pytest = "^7.0.0"
diff --git a/openbb_platform/core/tests/app/service/test_hub_service.py b/openbb_platform/core/tests/app/service/test_hub_service.py
index db2030d561ec..37cab472d228 100644
--- a/openbb_platform/core/tests/app/service/test_hub_service.py
+++ b/openbb_platform/core/tests/app/service/test_hub_service.py
@@ -5,9 +5,11 @@
from pathlib import Path
+from time import time
from unittest.mock import MagicMock, patch
import pytest
+from jwt import encode
from openbb_core.app.service.hub_service import (
Credentials,
HubService,
@@ -308,3 +310,35 @@ def test_platform2hub():
assert user_settings.features_keys["API_FRED_KEY"] == "fred"
assert user_settings.features_keys["benzinga_api_key"] == "benzinga"
assert "some_api_key" not in user_settings.features_keys
+
+
+@pytest.mark.parametrize(
+ "token, message",
+ [
+ # valid
+ (
+ encode(
+ {"some": "payload", "exp": int(time()) + 100},
+ "secret",
+ algorithm="HS256",
+ ),
+ None,
+ ),
+ # expired
+ (
+ encode(
+ {"some": "payload", "exp": int(time())}, "secret", algorithm="HS256"
+ ),
+ "Platform personal access token expired.",
+ ),
+ # invalid
+ ("invalid_token", "Failed to decode Platform token."),
+ ],
+)
+def test__check_token_expiration(token, message):
+ """Test check token expiration function."""
+ if message:
+ with pytest.raises(OpenBBError, match=message):
+ HubService._check_token_expiration(token)
+ else:
+ HubService._check_token_expiration(token)
From c2f5f7a3e6e3c4111ec7308cea43378c6b4f22e8 Mon Sep 17 00:00:00 2001
From: Henrique Joaquim
Date: Tue, 14 May 2024 14:35:17 +0100
Subject: [PATCH 08/13] [Feature] Styling adjustments (#6408)
* styling adjustments
* auto completion for main menu commands; cached results style
* move platform settings above
* don't check if obbject.results - we want to have the error message if smt goes wrong with the to_df()
* register only if there are results
* minor style change
---------
Co-authored-by: montezdesousa <79287829+montezdesousa@users.noreply.github.com>
---
.../argparse_translator/obbject_registry.py | 6 +-
cli/openbb_cli/config/menu_text.py | 9 +-
cli/openbb_cli/controllers/base_controller.py | 214 ++++++++++--------
.../controllers/base_platform_controller.py | 15 +-
cli/openbb_cli/controllers/cli_controller.py | 54 +++--
5 files changed, 164 insertions(+), 134 deletions(-)
diff --git a/cli/openbb_cli/argparse_translator/obbject_registry.py b/cli/openbb_cli/argparse_translator/obbject_registry.py
index e1c73fd0c127..372254b4b545 100644
--- a/cli/openbb_cli/argparse_translator/obbject_registry.py
+++ b/cli/openbb_cli/argparse_translator/obbject_registry.py
@@ -20,8 +20,10 @@ def _contains_obbject(uuid: str, obbjects: List[OBBject]) -> bool:
def register(self, obbject: OBBject) -> bool:
"""Designed to add an OBBject instance to the registry."""
- if isinstance(obbject, OBBject) and not self._contains_obbject(
- obbject.id, self._obbjects
+ if (
+ isinstance(obbject, OBBject)
+ and not self._contains_obbject(obbject.id, self._obbjects)
+ and obbject.results
):
self._obbjects.append(obbject)
return True
diff --git a/cli/openbb_cli/config/menu_text.py b/cli/openbb_cli/config/menu_text.py
index 06c7023ef1f5..ac3d0b9ca7dc 100644
--- a/cli/openbb_cli/config/menu_text.py
+++ b/cli/openbb_cli/config/menu_text.py
@@ -99,17 +99,18 @@ def _format_cmd_description(
else description
)
- def add_raw(self, text: str):
+ def add_raw(self, text: str, left_spacing: bool = False):
"""Append raw text (without translation)."""
- self.menu_text += text
+ if left_spacing:
+ self.menu_text += f"{self.SECTION_SPACING * ' '}{text}\n"
+ else:
+ self.menu_text += text
def add_section(
self, text: str, description: str = "", leading_new_line: bool = False
):
"""Append raw text (without translation)."""
spacing = (self.CMD_NAME_LENGTH - len(text) + self.SECTION_SPACING) * " "
- left_spacing = self.SECTION_SPACING * " "
- text = f"{left_spacing}{text}"
if description:
text = f"{text}{spacing}{description}\n"
diff --git a/cli/openbb_cli/controllers/base_controller.py b/cli/openbb_cli/controllers/base_controller.py
index 5c644f479c9b..e050311080d6 100644
--- a/cli/openbb_cli/controllers/base_controller.py
+++ b/cli/openbb_cli/controllers/base_controller.py
@@ -479,123 +479,137 @@ def call_record(self, other_args) -> None:
"\n[yellow]Remember to run 'stop' command when you are done!\n[/yellow]"
)
- def call_stop(self, _) -> None:
+ def call_stop(self, other_args) -> None:
"""Process stop command."""
- global RECORD_SESSION # noqa: PLW0603
- global SESSION_RECORDED # noqa: PLW0603
+ parser = argparse.ArgumentParser(
+ add_help=False,
+ formatter_class=argparse.ArgumentDefaultsHelpFormatter,
+ prog="stop",
+ description="Stop recording session into .openbb routine file",
+ )
+ # This is only for auto-completion purposes
+ _ = self.parse_simple_args(parser, other_args)
- if not RECORD_SESSION:
- session.console.print(
- "[red]There is no session being recorded. Start one using the command 'record'[/red]\n"
- )
- elif len(SESSION_RECORDED) < 5:
- session.console.print(
- "[red]Run at least 4 commands before stopping recording a session.[/red]\n"
- )
- else:
- current_user = session.user
+ if "-h" not in other_args and "--help" not in other_args:
+ global RECORD_SESSION # noqa: PLW0603
+ global SESSION_RECORDED # noqa: PLW0603
- # Check if the user just wants to store routine locally
- # This works regardless of whether they are logged in or not
- if RECORD_SESSION_LOCAL_ONLY:
- # Whitespaces are replaced by underscores and an .openbb extension is added
- title_for_local_storage = (
- SESSION_RECORDED_NAME.replace(" ", "_") + ".openbb"
+ if not RECORD_SESSION:
+ session.console.print(
+ "[red]There is no session being recorded. Start one using the command 'record'[/red]\n"
)
-
- routine_file = os.path.join(
- f"{current_user.preferences.export_directory}/routines",
- title_for_local_storage,
+ elif len(SESSION_RECORDED) < 5:
+ session.console.print(
+ "[red]Run at least 4 commands before stopping recording a session.[/red]\n"
)
+ else:
+ current_user = session.user
+
+ # Check if the user just wants to store routine locally
+ # This works regardless of whether they are logged in or not
+ if RECORD_SESSION_LOCAL_ONLY:
+ # Whitespaces are replaced by underscores and an .openbb extension is added
+ title_for_local_storage = (
+ SESSION_RECORDED_NAME.replace(" ", "_") + ".openbb"
+ )
- # If file already exists, add a timestamp to the name
- if os.path.isfile(routine_file):
- i = session.console.input(
- "A local routine with the same name already exists, "
- "do you want to override it? (y/n): "
+ routine_file = os.path.join(
+ f"{current_user.preferences.export_directory}/routines",
+ title_for_local_storage,
)
- session.console.print("")
- while i.lower() not in ["y", "yes", "n", "no"]:
- i = session.console.input("Select 'y' or 'n' to proceed: ")
- session.console.print("")
- if i.lower() in ["n", "no"]:
- new_name = (
- datetime.now().strftime("%Y%m%d_%H%M%S_")
- + title_for_local_storage
- )
- routine_file = os.path.join(
- current_user.preferences.export_directory,
- "routines",
- new_name,
- )
- session.console.print(
- f"[yellow]The routine name has been updated to '{new_name}'[/yellow]\n"
+ # If file already exists, add a timestamp to the name
+ if os.path.isfile(routine_file):
+ i = session.console.input(
+ "A local routine with the same name already exists, "
+ "do you want to override it? (y/n): "
)
+ session.console.print("")
+ while i.lower() not in ["y", "yes", "n", "no"]:
+ i = session.console.input("Select 'y' or 'n' to proceed: ")
+ session.console.print("")
+
+ if i.lower() in ["n", "no"]:
+ new_name = (
+ datetime.now().strftime("%Y%m%d_%H%M%S_")
+ + title_for_local_storage
+ )
+ routine_file = os.path.join(
+ current_user.preferences.export_directory,
+ "routines",
+ new_name,
+ )
+ session.console.print(
+ f"[yellow]The routine name has been updated to '{new_name}'[/yellow]\n"
+ )
- # Writing to file
- Path(os.path.dirname(routine_file)).mkdir(parents=True, exist_ok=True)
-
- with open(routine_file, "w") as file1:
- lines = ["# OpenBB Platform CLI - Routine", "\n"]
-
- username = getattr(
- session.user.profile.hub_session, "username", "local"
+ # Writing to file
+ Path(os.path.dirname(routine_file)).mkdir(
+ parents=True, exist_ok=True
)
- lines += [f"# Author: {username}", "\n\n"] if username else ["\n"]
- lines += [
- f"# Title: {SESSION_RECORDED_NAME}",
- "\n",
- f"# Tags: {SESSION_RECORDED_TAGS}",
- "\n\n",
- f"# Description: {SESSION_RECORDED_DESCRIPTION}",
- "\n\n",
- ]
- lines += [c + "\n" for c in SESSION_RECORDED[:-1]]
- # Writing data to a file
- file1.writelines(lines)
+ with open(routine_file, "w") as file1:
+ lines = ["# OpenBB Platform CLI - Routine", "\n"]
- session.console.print(
- f"[green]Your routine has been recorded and saved here: {routine_file}[/green]\n"
- )
+ username = getattr(
+ session.user.profile.hub_session, "username", "local"
+ )
- # If user doesn't specify they want to store routine locally
- # Confirm that the user is logged in
- elif not session.is_local():
- routine = "\n".join(SESSION_RECORDED[:-1])
- hub_session = current_user.profile.hub_session
+ lines += (
+ [f"# Author: {username}", "\n\n"] if username else ["\n"]
+ )
+ lines += [
+ f"# Title: {SESSION_RECORDED_NAME}",
+ "\n",
+ f"# Tags: {SESSION_RECORDED_TAGS}",
+ "\n\n",
+ f"# Description: {SESSION_RECORDED_DESCRIPTION}",
+ "\n\n",
+ ]
+ lines += [c + "\n" for c in SESSION_RECORDED[:-1]]
+ # Writing data to a file
+ file1.writelines(lines)
- if routine is not None:
- auth_header = (
- f"{hub_session.token_type} {hub_session.access_token.get_secret_value()}"
- if hub_session
- else None
+ session.console.print(
+ f"[green]Your routine has been recorded and saved here: {routine_file}[/green]\n"
)
- kwargs = {
- "auth_header": auth_header,
- "name": SESSION_RECORDED_NAME,
- "description": SESSION_RECORDED_DESCRIPTION,
- "routine": routine,
- "tags": SESSION_RECORDED_TAGS,
- "public": SESSION_RECORDED_PUBLIC,
- }
- response = upload_routine(**kwargs) # type: ignore
- if response is not None and response.status_code == 409:
- i = session.console.input(
- "A routine with the same name already exists, "
- "do you want to replace it? (y/n): "
- )
- session.console.print("")
- if i.lower() in ["y", "yes"]:
- kwargs["override"] = True # type: ignore
- response = upload_routine(**kwargs) # type: ignore
- else:
- session.console.print("[info]Aborted.[/info]")
- # Clear session to be recorded again
- RECORD_SESSION = False
- SESSION_RECORDED = list()
+ # If user doesn't specify they want to store routine locally
+ # Confirm that the user is logged in
+ elif not session.is_local():
+ routine = "\n".join(SESSION_RECORDED[:-1])
+ hub_session = current_user.profile.hub_session
+
+ if routine is not None:
+ auth_header = (
+ f"{hub_session.token_type} {hub_session.access_token.get_secret_value()}"
+ if hub_session
+ else None
+ )
+ kwargs = {
+ "auth_header": auth_header,
+ "name": SESSION_RECORDED_NAME,
+ "description": SESSION_RECORDED_DESCRIPTION,
+ "routine": routine,
+ "tags": SESSION_RECORDED_TAGS,
+ "public": SESSION_RECORDED_PUBLIC,
+ }
+ response = upload_routine(**kwargs) # type: ignore
+ if response is not None and response.status_code == 409:
+ i = session.console.input(
+ "A routine with the same name already exists, "
+ "do you want to replace it? (y/n): "
+ )
+ session.console.print("")
+ if i.lower() in ["y", "yes"]:
+ kwargs["override"] = True # type: ignore
+ response = upload_routine(**kwargs) # type: ignore
+ else:
+ session.console.print("[info]Aborted.[/info]")
+
+ # Clear session to be recorded again
+ RECORD_SESSION = False
+ SESSION_RECORDED = list()
def call_whoami(self, other_args: List[str]) -> None:
"""Process whoami command."""
diff --git a/cli/openbb_cli/controllers/base_platform_controller.py b/cli/openbb_cli/controllers/base_platform_controller.py
index 8ac12f4ed569..df67c708e148 100644
--- a/cli/openbb_cli/controllers/base_platform_controller.py
+++ b/cli/openbb_cli/controllers/base_platform_controller.py
@@ -159,8 +159,8 @@ def method(self, other_args: List[str], translator=translator):
if obbject:
- if isinstance(obbject, OBBject) and obbject.results:
- if session.max_obbjects_exceeded():
+ if isinstance(obbject, OBBject):
+ if session.max_obbjects_exceeded() and obbject.results:
session.obbject_registry.remove()
session.console.print(
"[yellow]Maximum number of OBBjects reached. The oldest entry was removed.[yellow]"
@@ -181,7 +181,9 @@ def method(self, other_args: List[str], translator=translator):
session.settings.SHOW_MSG_OBBJECT_REGISTRY
and register_result
):
- session.console.print("Added OBBject to registry.")
+ session.console.print(
+ "Added `OBBject` to cached results."
+ )
# making the dataframe available
# either for printing or exporting (or both)
@@ -326,11 +328,14 @@ def print_help(self):
)
if session.obbject_registry.obbjects:
- mt.add_section("Cached Results:\n", leading_new_line=True)
+ mt.add_info("\nCached Results")
for key, value in list(session.obbject_registry.all.items())[
: session.settings.N_TO_DISPLAY_OBBJECT_REGISTRY
]:
- mt.add_raw(f"\tOBB{key}: {value['command']}\n")
+ mt.add_raw(
+ f"[yellow]OBB{key}[/yellow]: {value['command']}",
+ left_spacing=True,
+ )
session.console.print(text=mt.menu_text, menu=self.PATH)
diff --git a/cli/openbb_cli/controllers/cli_controller.py b/cli/openbb_cli/controllers/cli_controller.py
index 2a98389067b6..49eaf92da333 100644
--- a/cli/openbb_cli/controllers/cli_controller.py
+++ b/cli/openbb_cli/controllers/cli_controller.py
@@ -188,8 +188,9 @@ def update_runtime_choices(self):
"--input": None,
"-i": "--input",
"--url": None,
+ "--help": None,
+ "-h": "--help",
}
-
choices["record"] = {
"--name": None,
"-n": "--name",
@@ -200,14 +201,36 @@ def update_runtime_choices(self):
"--tag1": {c: None for c in constants.SCRIPT_TAGS},
"--tag2": {c: None for c in constants.SCRIPT_TAGS},
"--tag3": {c: None for c in constants.SCRIPT_TAGS},
+ "--help": None,
+ "-h": "--help",
}
+ choices["stop"] = {"--help": None, "-h": "--help"}
+ choices["results"] = {"--help": None, "-h": "--help"}
self.update_completer(choices)
def print_help(self):
"""Print help."""
mt = MenuText("")
- mt.add_info("Configure your own CLI")
+
+ mt.add_info("Configure the platform and manage your account")
+ for router, value in PLATFORM_ROUTERS.items():
+ if router not in NON_DATA_ROUTERS or router in ["reference", "coverage"]:
+ continue
+ if value == "menu":
+ menu_description = (
+ obb.reference["routers"] # type: ignore
+ .get(f"{self.PATH}{router}", {})
+ .get("description")
+ ) or ""
+ mt.add_menu(
+ name=router,
+ description=menu_description.split(".")[0].lower(),
+ )
+ else:
+ mt.add_cmd(router)
+
+ mt.add_info("\nConfigure your CLI")
mt.add_menu(
"settings",
description="enable and disable feature flags, preferences and settings",
@@ -260,32 +283,17 @@ def print_help(self):
else:
mt.add_cmd(router)
- mt.add_info("\nConfigure the platform and manage your account")
-
- for router, value in PLATFORM_ROUTERS.items():
- if router not in NON_DATA_ROUTERS or router in ["reference", "coverage"]:
- continue
- if value == "menu":
- menu_description = (
- obb.reference["routers"] # type: ignore
- .get(f"{self.PATH}{router}", {})
- .get("description")
- ) or ""
- mt.add_menu(
- name=router,
- description=menu_description.split(".")[0].lower(),
- )
- else:
- mt.add_cmd(router)
-
- mt.add_info("\nAccess and manage your cached results")
+ mt.add_raw("\n")
mt.add_cmd("results")
if session.obbject_registry.obbjects:
- mt.add_section("Cached Results:\n", leading_new_line=True)
+ mt.add_info("\nCached Results")
for key, value in list(session.obbject_registry.all.items())[ # type: ignore
: session.settings.N_TO_DISPLAY_OBBJECT_REGISTRY
]:
- mt.add_raw(f"\tOBB{key}: {value['command']}\n") # type: ignore
+ mt.add_raw(
+ f"[yellow]OBB{key}[/yellow]: {value['command']}",
+ left_spacing=True,
+ )
session.console.print(text=mt.menu_text, menu="Home")
self.update_runtime_choices()
From ca0949396a4341cc0b59a99a91efd333e0260a2e Mon Sep 17 00:00:00 2001
From: Henrique Joaquim
Date: Tue, 14 May 2024 16:02:48 +0100
Subject: [PATCH 09/13] add platform imgs (#6410)
---
images/platform-dark.svg | 24 ++++++++++++++++++++++++
images/platform-light.svg | 24 ++++++++++++++++++++++++
2 files changed, 48 insertions(+)
create mode 100644 images/platform-dark.svg
create mode 100644 images/platform-light.svg
diff --git a/images/platform-dark.svg b/images/platform-dark.svg
new file mode 100644
index 000000000000..0a26fd75fe4f
--- /dev/null
+++ b/images/platform-dark.svg
@@ -0,0 +1,24 @@
+
diff --git a/images/platform-light.svg b/images/platform-light.svg
new file mode 100644
index 000000000000..e01e4107a79c
--- /dev/null
+++ b/images/platform-light.svg
@@ -0,0 +1,24 @@
+
From f87c21ed3cb2607c081b9ebfda4bee292c36a83d Mon Sep 17 00:00:00 2001
From: Henrique Joaquim
Date: Tue, 14 May 2024 16:09:32 +0100
Subject: [PATCH 10/13] [Feature] Main README (#6403)
* main readme
* lints
* mention platform cli
* test platform imgs
* Update README.md
platform imgs
* break line
* Update to Platform images
* remove old images
---------
Co-authored-by: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com>
---
README.md | 73 +++++++++++++-----------------------
images/openbb-logo-dark.svg | 17 ---------
images/openbb-logo-light.svg | 17 ---------
3 files changed, 27 insertions(+), 80 deletions(-)
delete mode 100644 images/openbb-logo-dark.svg
delete mode 100644 images/openbb-logo-light.svg
diff --git a/README.md b/README.md
index b6137bb262f6..0e816f4038ca 100644
--- a/README.md
+++ b/README.md
@@ -8,15 +8,17 @@ However, we are committed to continuing our mission to democratize investment re
To achieve that, we are working on a new CLI tool built on top of the OpenBB Platform that will soon be available to everyone for free.
+[![GitHub release](https://img.shields.io/github/release/OpenBB-finance/OpenBBTerminal.svg?maxAge=3600)](https://github.com/OpenBB-finance/OpenBBTerminal/releases)
+
---
+
-
-
+
+
[![Twitter](https://img.shields.io/twitter/url/https/twitter.com/openbb_finance.svg?style=social&label=Follow%20%40openbb_finance)](https://twitter.com/openbb_finance)
-[![GitHub release](https://img.shields.io/github/release/OpenBB-finance/OpenBBTerminal.svg?maxAge=3600)](https://github.com/OpenBB-finance/OpenBBTerminal/releases)
![Discord Shield](https://discordapp.com/api/guilds/831165782750789672/widget.png?style=shield)
[![Open in Dev Containers](https://img.shields.io/static/v1?label=Dev%20Containers&message=Open&color=blue&logo=visualstudiocode)](https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://github.com/OpenBB-finance/OpenBBTerminal)
@@ -25,39 +27,13 @@ To achieve that, we are working on a new CLI tool built on top of the OpenBB Pla
+[![PyPI](https://img.shields.io/pypi/v/openbb?color=blue&label=PyPI%20Package)](https://pypi.org/project/openbb/)
-The first financial terminal that is free and fully open source. With over 600 commands, the terminal has access to equity, options, crypto, forex, macro economy, fixed income, alternative datasets, and more.
+The first financial Platform that is free and fully open source.
-Sign up to the [OpenBB Hub](https://my.openbb.co/login) to use our Windows or MacOS installers to get started.
+Offers access to equity, options, crypto, forex, macro economy, fixed income, and more while also offering a broad range of extensions to enhance the user experience according to their needs.
-
-
+Sign up to the [OpenBB Hub](https://my.openbb.co/login) to get the most out of the OpenBB ecosystem.
@@ -75,20 +51,23 @@ Sign up to the [OpenBB Hub](https://my.openbb.co/login) to use our Windows or Ma
## 1. Installation
-If you wish to install the OpenBB Terminal or the OpenBB SDK, please use one of the following options:
+The OpenBB Platform can be installed as a [PyPI package](https://pypi.org/project/openbb/) by running `pip install openbb`
+
+or by cloning the repository directly with `git clone https://github.com/OpenBB-finance/OpenBBTerminal.git`.
-|**OpenBB Terminal**|**Usage**|
-|:-|:-|
-|[Windows Installer](https://docs.openbb.co/terminal/installation/windows)|Recommended way for Windows if you just want to use the OpenBB Terminal|
-|[MacOS Installer](https://docs.openbb.co/terminal/installation/macos)|Recommended way for MacOS if you just want to use the OpenBB Terminal|
-|[Source](https://docs.openbb.co/terminal/installation/source)|If you wish to contribute to the development of the OpenBB Terminal|
-|[Docker](https://docs.openbb.co/terminal/installation/docker)|An alternative way if you just want to use the OpenBB Terminal|
+Please find more about the installation process in the [OpenBB Documentation](https://docs.openbb.co/platform/installation).
-|**OpenBB SDK** |**Usage**|
-|:-|:-|
-|[PyPI](https://docs.openbb.co/terminal/installation/pypi)|If you wish to use the OpenBB SDK in Python or Jupyter Notebooks|
-|[Source](https://docs.openbb.co/terminal/installation/source)|If you wish to contribute to the development of the OpenBB Terminal|
-
+### OpenBB Platform CLI installation
+
+The OpenBB Platform CLI is a command-line interface that allows you to access the OpenBB Platform directly from your terminal.
+
+It can be installed by running `pip install openbb-cli`
+
+or by cloning the repository directly with `git clone https://github.com/OpenBB-finance/OpenBBTerminal.git`.
+
+Please find more about the installation process in the [OpenBB Documentation](https://docs.openbb.co/cli/installation).
+
+> The OpenBB Platform CLI offers an alternative to the former [OpenBB Terminal](https://github.com/OpenBB-finance/LegacyTerminal) as it has the same look and feel while offering the functionalities and extendability of the OpenBB Platform.
## 2. Contributing
@@ -96,7 +75,7 @@ There are three main ways of contributing to this project. (Hopefully you have s
### Become a Contributor
-* More information on our [CONTRIBUTING GUIDELINES](/CONTRIBUTING.md).
+* More information on our [Contributing Documentation](https://docs.openbb.co/platform/development/contributing).
### Create a GitHub ticket
@@ -115,6 +94,8 @@ We are most active on [our Discord](https://openbb.co/discord), but feel free to
Distributed under the MIT License. See
[LICENSE](https://github.com/OpenBB-finance/OpenBBTerminal/blob/main/LICENSE) for more information.
+
+
## 4. Disclaimer
Trading in financial instruments involves high risks including the risk of losing some, or all, of your investment
diff --git a/images/openbb-logo-dark.svg b/images/openbb-logo-dark.svg
deleted file mode 100644
index 75bcef259e11..000000000000
--- a/images/openbb-logo-dark.svg
+++ /dev/null
@@ -1,17 +0,0 @@
-
diff --git a/images/openbb-logo-light.svg b/images/openbb-logo-light.svg
deleted file mode 100644
index f9c341f7428f..000000000000
--- a/images/openbb-logo-light.svg
+++ /dev/null
@@ -1,17 +0,0 @@
-
From a116d9bbf2fb8f1a5308697cf3b8e651145f26a0 Mon Sep 17 00:00:00 2001
From: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com>
Date: Tue, 14 May 2024 17:38:06 +0200
Subject: [PATCH 11/13] [Feature] - OpenBB Platform CLI Unit tests (#6397)
* Unit test batch 1
* CLI controller
* Test batch 3
* Test batch 4
* Test batch 5
* clean some workflows and setup actions
* test
* rename wfs
* rename
* update action
* Skip
* fix cli tests
---------
Co-authored-by: Henrique Joaquim
Co-authored-by: Diogo Sousa
Co-authored-by: montezdesousa <79287829+montezdesousa@users.noreply.github.com>
---
.github/scripts/noxfile.py | 20 +-
.github/workflows/README.md | 226 ++++--------------
...pi-nightly.yml => deploy-pypi-nightly.yml} | 0
...pypi_platform.yml => deploy-test-pypi.yml} | 2 +-
.github/workflows/draft-release.yml | 2 +-
.../{linting.yml => general-linting.yml} | 4 -
.../{labels-PR.yml => gh-pr-labels.yml} | 0
.github/workflows/labels-issue.yml | 27 ---
.github/workflows/nightly-build.yml | 35 ---
.github/workflows/pypi.yml | 78 ------
...test.yml => test-integration-platform.yml} | 2 +-
.github/workflows/test-unit-cli.yml | 46 ++++
...atform-core.yml => test-unit-platform.yml} | 4 +-
.github/workflows/unit-test.yml | 72 ------
.pre-commit-config.yaml | 2 +-
cli/openbb_cli/config/menu_text.py | 14 --
cli/tests/test_argparse_translator.py | 94 ++++++++
...st_argparse_translator_obbject_registry.py | 89 +++++++
cli/tests/test_cli.py | 45 ++++
cli/tests/test_config_completer.py | 78 ++++++
cli/tests/test_config_console.py | 47 ++++
cli/tests/test_config_menu_text.py | 68 ++++++
cli/tests/test_config_setup.py | 49 ++++
cli/tests/test_config_style.py | 60 +++++
cli/tests/test_controllers_base_controller.py | 79 ++++++
...st_controllers_base_platform_controller.py | 70 ++++++
cli/tests/test_controllers_choices.py | 51 ++++
cli/tests/test_controllers_cli_controller.py | 79 ++++++
.../test_controllers_controller_factory.py | 61 +++++
cli/tests/test_controllers_script_parser.py | 106 ++++++++
.../test_controllers_settings_controller.py | 135 +++++++++++
cli/tests/test_controllers_utils.py | 157 ++++++++++++
cli/tests/test_models_settings.py | 72 ++++++
cli/tests/test_session.py | 44 ++++
openbb_platform/dev_install.py | 2 +-
35 files changed, 1503 insertions(+), 417 deletions(-)
rename .github/workflows/{pypi-nightly.yml => deploy-pypi-nightly.yml} (100%)
rename .github/workflows/{test_pypi_platform.yml => deploy-test-pypi.yml} (96%)
rename .github/workflows/{linting.yml => general-linting.yml} (96%)
rename .github/workflows/{labels-PR.yml => gh-pr-labels.yml} (100%)
delete mode 100644 .github/workflows/labels-issue.yml
delete mode 100644 .github/workflows/nightly-build.yml
delete mode 100644 .github/workflows/pypi.yml
rename .github/workflows/{platform-api-integration-test.yml => test-integration-platform.yml} (98%)
create mode 100644 .github/workflows/test-unit-cli.yml
rename .github/workflows/{platform-core.yml => test-unit-platform.yml} (89%)
delete mode 100644 .github/workflows/unit-test.yml
create mode 100644 cli/tests/test_argparse_translator.py
create mode 100644 cli/tests/test_argparse_translator_obbject_registry.py
create mode 100644 cli/tests/test_cli.py
create mode 100644 cli/tests/test_config_completer.py
create mode 100644 cli/tests/test_config_console.py
create mode 100644 cli/tests/test_config_menu_text.py
create mode 100644 cli/tests/test_config_setup.py
create mode 100644 cli/tests/test_config_style.py
create mode 100644 cli/tests/test_controllers_base_controller.py
create mode 100644 cli/tests/test_controllers_base_platform_controller.py
create mode 100644 cli/tests/test_controllers_choices.py
create mode 100644 cli/tests/test_controllers_cli_controller.py
create mode 100644 cli/tests/test_controllers_controller_factory.py
create mode 100644 cli/tests/test_controllers_script_parser.py
create mode 100644 cli/tests/test_controllers_settings_controller.py
create mode 100644 cli/tests/test_controllers_utils.py
create mode 100644 cli/tests/test_models_settings.py
create mode 100644 cli/tests/test_session.py
diff --git a/.github/scripts/noxfile.py b/.github/scripts/noxfile.py
index ed4411601c58..5bc4af2ce43d 100644
--- a/.github/scripts/noxfile.py
+++ b/.github/scripts/noxfile.py
@@ -9,10 +9,12 @@
PLATFORM_TESTS = [
str(PLATFORM_DIR / p) for p in ["tests", "core", "providers", "extensions"]
]
+CLI_DIR = ROOT_DIR / "cli"
+CLI_TESTS = CLI_DIR / "tests"
@nox.session(python=["3.9", "3.10", "3.11"])
-def tests(session):
+def unit_test_platform(session):
"""Run the test suite."""
session.install("poetry", "toml")
session.run(
@@ -27,3 +29,19 @@ def tests(session):
session.run(
"pytest", *PLATFORM_TESTS, f"--cov={PLATFORM_DIR}", "-m", "not integration"
)
+
+
+@nox.session(python=["3.9", "3.10", "3.11"])
+def unit_test_cli(session):
+ """Run the test suite."""
+ session.install("poetry", "toml")
+ session.run(
+ "python",
+ str(PLATFORM_DIR / "dev_install.py"),
+ "-e",
+ "all",
+ external=True,
+ )
+ session.install("pytest")
+ session.install("pytest-cov")
+ session.run("pytest", CLI_TESTS, f"--cov={CLI_DIR}")
diff --git a/.github/workflows/README.md b/.github/workflows/README.md
index 87caf3212758..6b03303131b2 100644
--- a/.github/workflows/README.md
+++ b/.github/workflows/README.md
@@ -1,27 +1,9 @@
# OpenBB Workflows
+
This directory contains the workflows for the OpenBB 🦋 Project. The workflows are:
-| Workflows | Summary | Branches
-| :-------------------- |:------------------ | :------------------
-| branch-name-check.yml | Checks if the branch name is valid and follows the naming convention. | all branches
-| build-release.yml | Builds the project and runs the tests. | main, release/*
-| docker-build.yml | Builds the docker image and pushes it to the docker hub. | all branches (only pushes to docker hub on main)
-| draft-release.yml | Creates a draft release when a new tag is pushed. | -
-| gh-pages.yml | Builds the documentation and deploy to github pages. | main and release/*
-| integration-test.yml | Runs the integration tests. | all branches
-| labels-issue.yml | Creates an issue when a new bug is reported. | -
-| labels-PR.yml | Adds labels to the issues and pull requests. | -
-| linting.yml | Runs the linters. | all branches
-| macos-build.yml | Builds the project on M1 Macs. | develop, main, release/*
-| macos-ml.yml | Builds the project on Mac OS X Full Clean Build with ML. | main
-| nightly-build.yml | Builds the project and runs the integration tests every night on the `develop` branch. | develop
-| pypi.yml | Publishes the package to PyPI. | all branches (only pushes to PyPI on main)
-| pypi-nightly.yml | Publishes the package to PyPI every night on the `develop` branch. | develop
-| unit-test.yml | Runs the unit tests. | all branches
-| windows_ml.yml | Builds the project on Windows 10 Full Clean Build with ML. | main
-| windows10_build.yml | Builds the project on Windows 10. | all branches
-
-## Branch Name Check Workflow
+## Branch Name Check
+
Objective: To check if pull request branch names follow the GitFlow naming convention before merging.
Triggered by: A pull request event where the target branch is either develop or main.
@@ -30,137 +12,22 @@ Branches checked: The source branch of a pull request and the target branch of a
Steps:
-1. Extract branch names: Using the jq tool, the source and target branch names are extracted from the pull request event. The branch names are then stored in environment variables and printed as output.
+1. Extract branch names: Using the jq tool, the source and target branch names are extracted from the pull request event. The branch names are then stored in environment variables and printed as output.
-2. Show Output result for source-branch and target-branch: The source and target branch names are printed to the console.
+2. Show Output result for source-branch and target-branch: The source and target branch names are printed to the console.
-3. Check branch name for develop PRs: If the target branch is develop, then the source branch is checked against a regular expression to ensure that it follows the GitFlow naming convention. If the branch name is invalid, a message is printed to the console and the workflow exits with a status code of 1.
+3. Check branch name for develop PRs: If the target branch is develop, then the source branch is checked against a regular expression to ensure that it follows the GitFlow naming convention. If the branch name is invalid, a message is printed to the console and the workflow exits with a status code of 1.
-4. Check branch name for main PRs: If the target branch is main, then the source branch is checked against a regular expression to ensure that it is either a hotfix or a release branch. If the branch name is invalid, a message is printed to the console and the workflow exits with a status code of 1.
+4. Check branch name for main PRs: If the target branch is main, then the source branch is checked against a regular expression to ensure that it is either a hotfix or a release branch. If the branch name is invalid, a message is printed to the console and the workflow exits with a status code of 1.
Note: The GitFlow naming convention for branches is as follows:
-- Feature branches: feature/
-- Hotfix branches: hotfix/
-- Release branches: release/(rc)
-
-## Build Release Workflow
-This GitHub Actions workflow is responsible for building and releasing software for multiple platforms (Windows, M1 MacOS, Intel MacOS, and Docker).
-The workflow has four jobs:
-
-- `trigger-windows-build`
-- `trigger-macos-build`
-- `trigger-intel-build`
-- `trigger-docker-build`
-
-Each job uses the `aurelien-baudet/workflow-dispatch` action to trigger another workflow, respectively `windows10_build.yml`, `m1_macos_build.yml`, `intel_macos_build.yml`, and `docker.yml`. The `GITHUB_TOKEN` is passed as a secret so that the triggered workflows have access to the necessary permissions. The `wait-for-completion-timeout` is set to 2 hours, which is the maximum amount of time the job will wait for the triggered workflow to complete.
-
-## Docker Workflow
-This GitHub Actions workflow is responsible for building and pushing the docker image to the itHub Container Registry. This workflow is triggered when a new change is pushed to the main branch of the repository, and the Docker image is published to the GitHub Container Registry.
-
-Steps
------
-
-1. Checkout Code: This step checks out the code from the GitHub repository.
-
-2. Login to GitHub Container Registry: This step logs into the GitHub Container Registry using the GitHub Actions token.
-
-3. Setup Commit Hash: This step sets the commit hash of the code that is being built.
-
-4. Build Env File: This step builds the environment file for the Docker image.
-
-5. Building the Docker Image: This step builds the Docker image using the scripts in the `build/docker` directory.
-
-6. Publishing the Docker Image: This step publishes the Docker image to the GitHub Container Registry. The Docker image is only pushed to the registry if the branch being built is `main`.
-
-## Release Drafter Workflow
-This GitHub Actions workflow is designed to automatically generate and update draft releases in a GitHub repository. The workflow is triggered when it is manually dispatched, allowing you to control when the draft releases are updated.
-
-## GH Pages Workflow
-This GitHub Actions workflow is responsible for building the documentation and deploying it to GitHub Pages. This workflow is triggered when a new change is pushed to the `main` or `release` branch of the repository, and the documentation is published to GitHub Pages.
-
-## Integration Test Workflow
-This GitHub Action is used to run integration tests on your code repository. It is triggered on pushes to the `release/*` or `main` branches, and it runs on the latest version of Ubuntu.
-
-The workflow consists of the following steps:
-
-1. Check out the code from the repository
-2. Set up Python 3.9
-3. Install Poetry, a package and dependency manager for Python
-4. Load a cached virtual environment created by Poetry, to speed up the process if possible
-5. Install dependencies specified in the `poetry.lock` file
-6. Run the integration tests using the `terminal.py` script
-7. Upload a summary of the test results to Slack
-
-The results of the tests are captured in a file called `result.txt`. The summary of the tests, including information about failed tests, is then uploaded to Slack using the `adrey/slack-file-upload-action` GitHub Action.
-
-## Linting Workflow
-This GitHub Actions workflow is responsible for running linting checks on the codebase. This workflow is triggered on pull request events such as `opened`, `synchronize`, and `edited`, and push events on branches with names that start with `feature/`, `hotfix/`, or `release/`. The workflow also sets a number of environment variables and uses Github Actions caching to improve performance.
-
-It consists of two jobs: `code-linting` and `markdown-link-check`.
-
-The first job, `code-linting`, runs on an Ubuntu machine and performs several linting tasks on the code in the repository, including:
-
-- Checking out the code from the repository
-- Setting up Python 3.9
-- Installing a number of Python packages necessary for the linting tasks
-- Running `bandit` to check for security vulnerabilities
-- Running `black` to check the code formatting
-- Running `codespell` to check the spelling of comments, strings, and variable names
-- Running `ruff` to check the use of Python
-- Running `mypy` to check the type annotations
-- Running `pyupgrade` to upgrade Python 2 code to Python 3
-- Running `pylint` to perform static analysis of the code
-
-The second job, `markdown-link-check`, runs on an Ubuntu machine and performs linting of the markdown files in the repository. It uses a Docker container `avtodev/markdown-lint` to perform the linting.
-
-## MacOS Build Workflow
-This GitHub Actions workflow is used to build a version of the OpenBB Platform CLI for M1 MacOS. The build process includes installing necessary dependencies, building the terminal application using PyInstaller, creating a DMG file for distribution, and running integration tests on the built application.
-
-Jobs
-----
-
-The workflow consists of a single job named `Build` which runs on self-hosted MacOS systems with ARM64 architecture. The job performs the following steps:
-
-1. Checkout: The main branch of the repository is checked out, allowing for the commit hashes to line up.
-2. Git Log: The log of the Git repository is displayed.
-3. Install create-dmg: The `create-dmg` tool is installed using Homebrew.
-4. Clean Previous Path: The previous PATH environment variable is cleared and restored to its default values.
-5. Setup Conda Caching: The miniconda environment is set up using a caching mechanism for faster workflow execution after the first run.
-6. Setup Miniconda: Miniconda is set up using the `conda-3-9-env-full.yaml` environment file, with channels `conda-forge` and `defaults`, and with the `build_env` environment activated.
-7. Run Poetry: Poetry is used to install the dependencies for the project.
-8. Install PyInstaller: PyInstaller is installed using Poetry.
-9. Poetry Install Portfolio Optimization and Forecasting Toolkits: The portfolio optimization and forecasting toolkits are installed using Poetry.
-10. Install Specific Papermill: A specific version of Papermill is installed using pip.
-11. Build Bundle: The terminal application is built using PyInstaller, with icons and assets copied to the DMG directory.
-12. Create DMG: The DMG file is created using the `create-dmg` tool.
-13. Clean up Build Artifacts: The build artifacts such as the terminal directory and DMG directory are removed.
-14. Save Build Artifact DMG: The DMG file is saved as a build artifact.
-15. Convert & Mount DMG: The DMG file is converted and mounted.
-16. Directory Change: The current directory is changed to the mounted DMG file.
-17. Unmount DMG: The mounted DMG file is unmounted.
-18. Run Integration Tests: The built terminal application is run with integration tests, and the results are displayed.
-
-Finally, the integration tests are run and the results are logged. The workflow is configured to run only when triggered by a workflow dispatch event and runs in a concurrent group, with the ability to cancel in-progress jobs.
-
-## Nightly Build Workflow
-This code is a GitHub Actions workflow configuration file that is used to trigger other workflows when certain events occur. The main purpose of this workflow is to trigger builds on different platforms when a release is made or a pull request is made to the main branch.
-
-This workflow is triggered at UTC+0 daily by the GitHub Action schedule event.
-
-The job includes the following steps:
-
-1. Trigger Windows Build: This step uses the `aurelien-baudet/workflow-dispatch` action to trigger the windows10_build.yml workflow.
-
-2. Trigger macOS Build: This step uses the `aurelien-baudet/workflow-dispatch` action to trigger the m1_macos_build.yml workflow
-
-3. Trigger Intel Build: This step uses the `aurelien-baudet/workflow-dispatch` action to trigger the intel_macos_build.yml workflow
+- Feature branches: feature/
+- Hotfix branches: hotfix/
+- Release branches: release/(rc)
-4. Trigger Docker Build: This step uses the `aurelien-baudet/workflow-dispatch` action to trigger the docker.yml workflow
+## Deploy to PyPI - Nightly
-This workflow also uses a concurrency setting that groups the jobs by the workflow and ref, and cancels any in-progress jobs.
-
-## Nightly PyPI Publish Workflow
This workflow is used to publish the latest version of the OpenBB Platform CLI to PyPI. The workflow is triggered at UTC+0 daily by the GitHub Action schedule event.
It does this by first updating the `pyproject.toml` file with a pre-determined version string of the form `.dev`, where `` represents the current day's date as a 8 digit number.
@@ -169,12 +36,13 @@ Then, the code installs `pypa/build` and uses `python -m build` to create a bina
Finally, it uses the PyPA specific action `gh-action-pypi-publish` to publish the created files to PyPI.
-## PYPI publish Workflow
+## Deploy the OpenBB Platform to Test PyPI
+
The Github Action code `Deploy to PyPI` is used to deploy a Python project to PyPI (Python Package Index) and TestPyPI, which is a separate package index for testing purposes. The code is triggered on two events:
-1. Push event: The code is triggered whenever there is a push to the `release/*` and `main` branches.
+1. Push event: The code is triggered whenever there is a push to the `release/*` and `main` branches.
-2. Workflow dispatch event: The code can be manually triggered by the workflow dispatch event.
+2. Workflow dispatch event: The code can be manually triggered by the workflow dispatch event.
The code sets the concurrency to the `group` and the option `cancel-in-progress` is set to `true` to ensure that the running jobs in the same `group` are cancelled in case another job is triggered.
@@ -186,47 +54,47 @@ Similarly, the `deploy-pypi` job is triggered only if the pushed branch starts w
Note: The code uses the `pypa/build` package for building the binary wheel and source tarball, and the `pypa/gh-action-pypi-publish@release/v1` Github Action for publishing the distributions to PyPI and TestPyPI.
-## Unit Tests Workflow
-This workflow is used to run unit tests on the OpenBB Platform CLI. The workflow is triggered on the following events:
-The events this workflow will respond to are:
+## Draft release
-1. Pull requests that are opened, synchronized, edited, or closed. The pull request must be made to the `develop` or `main` branches.
+This GitHub Actions workflow is designed to automatically generate and update draft releases in a GitHub repository. The workflow is triggered when it is manually dispatched, allowing you to control when the draft releases are updated.
-2. Pushes to the `release/*` branches.
+## General Linting
-Each job in the workflow specifies a set of steps that are executed in order.
+This GitHub Actions workflow is responsible for running linting checks on the codebase. This workflow is triggered on pull request events such as `opened`, `synchronize`, and `edited`, and push events on branches with names that start with `feature/`, `hotfix/`, or `release/`. The workflow also sets a number of environment variables and uses Github Actions caching to improve performance.
-The first job, `check-files-changed`, checks whether there are any changes to certain file types in the repository, such as Python files and lockfiles. If there are changes, then the `check-changes` output variable is set to `true`.
+It consists of two jobs: `code-linting` and `markdown-link-check`.
+
+The first job, `code-linting`, runs on an Ubuntu machine and performs several linting tasks on the code in the repository, including:
+
+- Checking out the code from the repository
+- Setting up Python 3.9
+- Installing a number of Python packages necessary for the linting tasks
+- Running `bandit` to check for security vulnerabilities
+- Running `black` to check the code formatting
+- Running `codespell` to check the spelling of comments, strings, and variable names
+- Running `ruff` to check the use of Python
+- Running `pylint` to perform static analysis of the code
+- Running `mypy` to check the type annotations
+- Running `pydocstyle` to check the docstrings
+
+The second job, `markdown-link-check`, runs on an Ubuntu machine and performs linting of the markdown files in the repository. It uses a Docker container `avtodev/markdown-lint` to perform the linting.
+
+## Deploy to GitHub Pages
+
+This GitHub Actions workflow is responsible for building the documentation and deploying it to GitHub Pages. This workflow is triggered when a new change is pushed to the `main` or `release` branch of the repository, and the documentation is published to GitHub Pages.
-The next job, `base-test`, runs a series of tests if `check-changes` is `true` and the base branch of the pull request is `develop`. This job sets up a Python 3.9 environment, installs Poetry, and then runs tests using `pytest`. Finally, it starts the terminal and exits.
+## Pull Request Labels
-The next job, `tests-python`, runs tests for different versions of Python (3.8, 3.9, and 3.10) on the `ubuntu-latest` operating system. It sets up the specified Python version, installs Poetry and dependencies, and then runs tests using `pytest`.
+Automatic labelling of pull requests.
-The next job, `full-test`, uses the GitHub Actions `checkout` action to checkout the code, followed by the `setup-python` action to set up the specified version of Python. Then, the `install-poetry` action is used to install the package manager Poetry, and a cache is set up using the `actions/cache` action to avoid re-installing dependencies. After that, the dependencies are installed using Poetry, and a list of installed packages is displayed. Then, the tests are run using `pytest`, and finally, the `terminal.py` script is started and exited.
+## 🚉 Integration test Platform (API)
-The last job, `tests-conda`, sets up a Miniconda environment using the `setup-miniconda` action. The environment is specified using a YAML file and is activated. Then, the tests are run.
+Run `openbb_platform` API integration tests,
-## Windows 10 Build Workflow
-This is a GitHub Actions workflow file that automates the build and testing process for the OpenBB Platform CLI on Windows 10. The workflow consists of two jobs:
+## 🖥️ Unit test CLI
-1. Windows-Build
-2. Build-Exe
+Run `cli` directory unit tests.
-- The Windows-Build job does the following:
- - Sets up the Windows Git configuration for long file paths.
- - Checks out the repository code.
- - Sets up Python 3.9 and creates an OpenBB environment using poetry.
- - Installs necessary packages and builds the terminal using PyInstaller.
- - Uploads the built artifact to GitHub as an artifact.
-- The Build-Exe job does the following:
- - Sets up the Windows Git configuration for long file paths.
- - Checks out the repository code.
- - Downloads the built artifact from the previous Windows-Build job.
- - Copies the files into an app folder for building the EXE file.
- - Builds the EXE file using NSIS.
- - Uploads the built EXE as an artifact to GitHub.
- - Runs integration tests on the terminal and saves the results to a text file.
- - Uploads the test results summary to Slack.
- - Cleans up previous build files and artifacts.
+## 🚉 Unit test Platform
-This workflow is triggered by the `workflow_dispatch` event and runs in concurrency with other workflows in the same group, with the ability to cancel in-progress builds. The concurrency group is defined as `${{ github.workflow }}-${{ github.ref }}`.
\ No newline at end of file
+Run `openbb_platform` directory unit tests - providers, extensions, etc.
diff --git a/.github/workflows/pypi-nightly.yml b/.github/workflows/deploy-pypi-nightly.yml
similarity index 100%
rename from .github/workflows/pypi-nightly.yml
rename to .github/workflows/deploy-pypi-nightly.yml
diff --git a/.github/workflows/test_pypi_platform.yml b/.github/workflows/deploy-test-pypi.yml
similarity index 96%
rename from .github/workflows/test_pypi_platform.yml
rename to .github/workflows/deploy-test-pypi.yml
index 54fe09f7dc24..c5a3bb6a3756 100644
--- a/.github/workflows/test_pypi_platform.yml
+++ b/.github/workflows/deploy-test-pypi.yml
@@ -1,4 +1,4 @@
-name: Deploy the OpenBB Platform and the OpenBBTerminal to Test PyPI
+name: Deploy the OpenBB Platform to Test PyPI
on:
push:
diff --git a/.github/workflows/draft-release.yml b/.github/workflows/draft-release.yml
index 3dab21e7812d..01e52ee80d56 100644
--- a/.github/workflows/draft-release.yml
+++ b/.github/workflows/draft-release.yml
@@ -1,4 +1,4 @@
-name: Release Drafter
+name: Draft release
on:
workflow_dispatch:
diff --git a/.github/workflows/linting.yml b/.github/workflows/general-linting.yml
similarity index 96%
rename from .github/workflows/linting.yml
rename to .github/workflows/general-linting.yml
index 2abf2e5455f0..02cf0b3454db 100644
--- a/.github/workflows/linting.yml
+++ b/.github/workflows/general-linting.yml
@@ -1,10 +1,6 @@
name: General Linting
env:
- OPENBB_ENABLE_QUICK_EXIT: true
- OPENBB_LOG_COLLECT: false
- OPENBB_USE_PROMPT_TOOLKIT: false
- OPENBB_FILE_OVERWRITE: true
PIP_DEFAULT_TIMEOUT: 100
on:
diff --git a/.github/workflows/labels-PR.yml b/.github/workflows/gh-pr-labels.yml
similarity index 100%
rename from .github/workflows/labels-PR.yml
rename to .github/workflows/gh-pr-labels.yml
diff --git a/.github/workflows/labels-issue.yml b/.github/workflows/labels-issue.yml
deleted file mode 100644
index 01486ba0824a..000000000000
--- a/.github/workflows/labels-issue.yml
+++ /dev/null
@@ -1,27 +0,0 @@
-name: "Set Issue Label and Assignee"
-on:
- issues:
- types: [opened]
-
-jobs:
- test:
- runs-on: ubuntu-latest
- steps:
- - uses: Naturalclar/issue-action@v2.0.2
- with:
- title-or-body: "both"
- parameters:
- '[ {"keywords": ["bug", "error", "issue"], "labels": ["bug"]},
- {"keywords": ["help", "guidance"], "labels": ["help-wanted"], "assignees": ["colin99d"]},
- {"keywords": ["portfolio"], "labels": ["portfolio"], "assignees": ["JerBouma", "montezdesousa"]},
- {"keywords": ["dashboards"], "labels": ["dashboards"], "assignees": ["colin99d"]},
- {"keywords": ["dependencies"], "labels": ["dependencies"], "assignees": ["piiq"]},
- {"keywords": ["build"], "labels": ["build"], "assignees": ["piiq"]},
- {"keywords": ["jupyter"], "labels": ["jupyterlab"], "assignees": ["piiq"]},
- {"keywords": ["reports"], "labels": ["notebookreports"], "assignees": ["piiq"]},
- {"keywords": ["installer"], "labels": ["installer"], "assignees": ["piiq", "andrewkenreich"]},
- {"keywords": ["pytest", "tests"], "labels": ["tests"], "assignees": ["Chavithra"]},
- {"keywords": ["guides"], "labels": ["guides"], "assignees": ["JerBouma"]},
- {"keywords": ["crypto"], "labels": ["crypto"], "assignees": ["minhhoang1023"]}
- ]'
- github-token: "${{ secrets.GITHUB_TOKEN }}"
diff --git a/.github/workflows/nightly-build.yml b/.github/workflows/nightly-build.yml
deleted file mode 100644
index 90d68cb9de5a..000000000000
--- a/.github/workflows/nightly-build.yml
+++ /dev/null
@@ -1,35 +0,0 @@
-name: Nightly Build
-
-env:
- OPENBB_ENABLE_QUICK_EXIT: true
- OPENBB_LOG_COLLECT: false
- OPENBB_USE_PROMPT_TOOLKIT: false
- PIP_DEFAULT_TIMEOUT: 100
- OPENBB_FILE_OVERWRITE: true
- PYTHONNOUSERSITE: 1
-
-on:
- schedule:
- - cron: "0 0 * * *"
-
-permissions:
- actions: write
-
-jobs:
- trigger-pypi-build:
- runs-on: ubuntu-latest
- steps:
- - name: Trigger PyPI Build
- uses: aurelien-baudet/workflow-dispatch@v2
- with:
- workflow: pypi-nightly.yml
- token: ${{ secrets.GITHUB_TOKEN }}
-
- trigger-api-integration-test:
- runs-on: ubuntu-latest
- steps:
- - name: Trigger Platform API Integration Test
- uses: aurelien-baudet/workflow-dispatch@v2
- with:
- workflow: platform-api-integration-test.yml
- token: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.github/workflows/pypi.yml b/.github/workflows/pypi.yml
deleted file mode 100644
index efc2fe5d9d8f..000000000000
--- a/.github/workflows/pypi.yml
+++ /dev/null
@@ -1,78 +0,0 @@
-name: Deploy to PyPI
-
-on:
- push:
- branches:
- - release/v3/*
-
- workflow_dispatch:
-
-concurrency:
- group: ${{ github.workflow }}-${{ github.ref }}
- cancel-in-progress: true
-
-jobs:
- deploy-test-pypi:
- name: Build and publish 📦 to TestPyPI
- if: startsWith(github.ref, 'refs/heads/release/')
- runs-on: ubuntu-latest
-
- steps:
- - uses: actions/checkout@v3
- - name: Setup Python 3.9
- uses: actions/setup-python@v4
- with:
- python-version: "3.9"
-
- - name: Install pypa/build
- run: >-
- python -m
- pip install
- build
- --user
- - name: Build a binary wheel and a source tarball
- run: >-
- python -m
- build
- --sdist
- --wheel
- --outdir dist/
- .
-
- - name: Publish distribution 📦 to Test PyPI
- uses: pypa/gh-action-pypi-publish@release/v1
- with:
- password: ${{ secrets.TEST_PYPI_API_TOKEN }}
- repository_url: https://test.pypi.org/legacy/
-
- deploy-pypi:
- name: Build and publish 📦 to PyPI
- if: startsWith(github.ref, 'refs/heads/main')
- runs-on: ubuntu-latest
-
- steps:
- - uses: actions/checkout@v3
- - name: Setup Python 3.9
- uses: actions/setup-python@v4
- with:
- python-version: "3.9"
-
- - name: Install pypa/build
- run: >-
- python -m
- pip install
- build
- --user
- - name: Build a binary wheel and a source tarball
- run: >-
- python -m
- build
- --sdist
- --wheel
- --outdir dist/
- .
-
- - name: Publish distribution 📦 to PyPI
- uses: pypa/gh-action-pypi-publish@release/v1
- with:
- password: ${{ secrets.PYPI_API_TOKEN }}
diff --git a/.github/workflows/platform-api-integration-test.yml b/.github/workflows/test-integration-platform.yml
similarity index 98%
rename from .github/workflows/platform-api-integration-test.yml
rename to .github/workflows/test-integration-platform.yml
index 11b4c9c5d40f..143ca20d50a7 100644
--- a/.github/workflows/platform-api-integration-test.yml
+++ b/.github/workflows/test-integration-platform.yml
@@ -1,4 +1,4 @@
-name: API Integration Tests
+name: 🚉 Integration test Platform (API)
on:
workflow_dispatch:
diff --git a/.github/workflows/test-unit-cli.yml b/.github/workflows/test-unit-cli.yml
new file mode 100644
index 000000000000..38c6348fc03a
--- /dev/null
+++ b/.github/workflows/test-unit-cli.yml
@@ -0,0 +1,46 @@
+name: 🖥️ Unit test CLI
+
+on:
+ pull_request:
+ branches:
+ - develop
+ paths:
+ - 'cli/**'
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }}
+ cancel-in-progress: true
+
+jobs:
+ unit_tests:
+ runs-on: ubuntu-latest
+ strategy:
+ fail-fast: false
+
+ matrix:
+ python_version:
+ ["3.9", "3.10", "3.11"]
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v3
+ with:
+ ref: ${{ github.event.pull_request.head.sha }}
+ - name: Install Python ${{ matrix.python_version }}
+ uses: actions/setup-python@v4
+ with:
+ python-version: ${{ matrix.python_version }}
+ allow-prereleases: true
+ cache: "pip"
+
+ - name: Cache pip packages
+ uses: actions/cache@v2
+ with:
+ path: ~/.cache/pip
+ key: ${{ runner.os }}-pip-${{ matrix.python-version }}-${{ hashFiles('cli/poetry.lock') }}
+ restore-keys: |
+ ${{ runner.os }}-pip-
+
+ - name: Run tests
+ run: |
+ pip install nox
+ nox -f .github/scripts/noxfile.py -s unit_test_cli --python ${{ matrix.python_version }}
diff --git a/.github/workflows/platform-core.yml b/.github/workflows/test-unit-platform.yml
similarity index 89%
rename from .github/workflows/platform-core.yml
rename to .github/workflows/test-unit-platform.yml
index 84ac783cfaf1..e5323f380500 100644
--- a/.github/workflows/platform-core.yml
+++ b/.github/workflows/test-unit-platform.yml
@@ -1,4 +1,4 @@
-name: Test Platform V4
+name: 🚉 Unit test Platform
on:
pull_request:
@@ -43,4 +43,4 @@ jobs:
- name: Run tests
run: |
pip install nox
- nox -f .github/scripts/noxfile.py -s tests --python ${{ matrix.python_version }}
+ nox -f .github/scripts/noxfile.py -s unit_test_platform --python ${{ matrix.python_version }}
diff --git a/.github/workflows/unit-test.yml b/.github/workflows/unit-test.yml
deleted file mode 100644
index 32dfc58d5aa7..000000000000
--- a/.github/workflows/unit-test.yml
+++ /dev/null
@@ -1,72 +0,0 @@
-name: Unit Test
-
-env:
- OPENBB_ENABLE_QUICK_EXIT: true
- OPENBB_LOG_COLLECT: false
- OPENBB_USE_PROMPT_TOOLKIT: false
- OPENBB_FILE_OVERWRITE: true
- OPENBB_ENABLE_CHECK_API: false
- OPENBB_PREVIOUS_USE: true
- OPENBB_USE_INTERACTIVE_DF: false
- PIP_DEFAULT_TIMEOUT: 100
-
-on:
- pull_request:
- branches:
- - develop
- - main
- types: [opened, synchronize, edited, closed, labeled]
- push:
- branches:
- - release/*
- merge_group:
- types: [checks_requested]
-concurrency:
- group: ${{ github.workflow }}-${{ github.ref }}
- cancel-in-progress: true
-
-jobs:
- check-files-changed:
- name: Check for changes
- runs-on: ubuntu-latest
- # Run this job only if the PR is not merged, PR != draft and the event is not a push
- if: github.event.pull_request.merged == false && github.event_name != 'push' && github.event.pull_request.draft == false
- outputs:
- check-changes: ${{ steps.check-changes.outputs.check-changes }}
- check-platform-changes: ${{ steps.check-platform-changes.outputs.check-platform-changes }} # New output for openbb_platform changes
- steps:
- - name: Checkout
- uses: actions/checkout@v1 # v1 is used to preserve the git history and works with the git diff command
- with:
- fetch-depth: 100
- # The GitHub token is preserved by default but this job doesn't need
- # to be able to push to GitHub.
-
- # Check for changes to python files, lockfiles and the openbb_terminal folder
- - name: Check for changes to files to trigger unit test
- id: check-changes
- run: |
- current_branch=$(jq -r .pull_request.base.ref "$GITHUB_EVENT_PATH")
-
- if git diff --name-only origin/$current_branch HEAD | grep -E ".py$|openbb_terminal\/.*|pyproject.toml|poetry.lock|requirements.txt|requirements-full.txt"; then
- echo "check-changes=true" >> $GITHUB_OUTPUT
- else
- echo "check-changes=false" >> $GITHUB_OUTPUT
- fi
-
- # Check for changes to openbb_platform
- - name: Check for changes to openbb_platform
- id: check-platform-changes
- run: |
- current_branch=$(jq -r .pull_request.base.ref "$GITHUB_EVENT_PATH")
-
- if git diff --name-only origin/$current_branch HEAD | grep -E "openbb_platform\/.*"; then
- echo "check-platform-changes=true" >> $GITHUB_OUTPUT
- else
- echo "check-platform-changes=false" >> $GITHUB_OUTPUT
- fi
-
- - name: Show output of previous step
- run: |
- echo "check-changes=${{ steps.check-changes.outputs.check-changes }}"
- echo "check-platform-changes=${{ steps.check-platform-changes.outputs.check-platform-changes }}"
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 5f507829eedd..887df4e3e2c5 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -39,7 +39,7 @@ repos:
"--ignore-words-list=VAI,MIS,shs,gard,te,commun,parana,ro,zar,vie,hel,jewl,zlot,ba,buil,coo,ether,hist,hsi,mape,navagation,operatio,pres,ser,yeld,shold,ist,varian,datas,ake,creat,statics,ket,toke,certi,buidl,ot,fo",
"--quiet-level=2",
"--skip=./**/tests/**,./**/test_*.py,.git,*.css,*.csv,*.html,*.ini,*.ipynb,*.js,*.json,*.lock,*.scss,*.txt,*.yaml,build/pyinstaller/*,./website/config.toml",
- "-x=.github/workflows/linting.yml"
+ "-x=.github/workflows/general-linting.yml"
]
- repo: local
hooks:
diff --git a/cli/openbb_cli/config/menu_text.py b/cli/openbb_cli/config/menu_text.py
index ac3d0b9ca7dc..ed2ba6ddb428 100644
--- a/cli/openbb_cli/config/menu_text.py
+++ b/cli/openbb_cli/config/menu_text.py
@@ -106,20 +106,6 @@ def add_raw(self, text: str, left_spacing: bool = False):
else:
self.menu_text += text
- def add_section(
- self, text: str, description: str = "", leading_new_line: bool = False
- ):
- """Append raw text (without translation)."""
- spacing = (self.CMD_NAME_LENGTH - len(text) + self.SECTION_SPACING) * " "
- if description:
- text = f"{text}{spacing}{description}\n"
-
- if leading_new_line:
- self.menu_text += "\n" + text
-
- else:
- self.menu_text += text
-
def add_info(self, text: str):
"""Append information text (after translation)."""
self.menu_text += f"[info]{text}:[/info]\n"
diff --git a/cli/tests/test_argparse_translator.py b/cli/tests/test_argparse_translator.py
new file mode 100644
index 000000000000..e88eb1b811f2
--- /dev/null
+++ b/cli/tests/test_argparse_translator.py
@@ -0,0 +1,94 @@
+"""Test the Argparse Translator."""
+
+from argparse import ArgumentParser
+
+import pytest
+from openbb_cli.argparse_translator.argparse_translator import (
+ ArgparseTranslator,
+ CustomArgument,
+ CustomArgumentGroup,
+)
+
+# pylint: disable=protected-access
+
+
+def test_custom_argument_action_validation():
+ """Test that CustomArgument raises an error for invalid actions."""
+ with pytest.raises(ValueError) as excinfo:
+ CustomArgument(
+ name="test",
+ type=bool,
+ dest="test",
+ default=False,
+ required=True,
+ action="store",
+ help="Test argument",
+ nargs=None,
+ choices=None,
+ )
+ assert 'action must be "store_true"' in str(excinfo.value)
+
+
+def test_custom_argument_remove_props_on_store_true():
+ """Test that CustomArgument removes type, nargs, and choices on store_true."""
+ argument = CustomArgument(
+ name="verbose",
+ type=None,
+ dest="verbose",
+ default=None,
+ required=False,
+ action="store_true",
+ help="Verbose output",
+ nargs=None,
+ choices=None,
+ )
+ assert argument.type is None
+ assert argument.nargs is None
+ assert argument.choices is None
+
+
+def test_custom_argument_group():
+ """Test the CustomArgumentGroup class."""
+ args = [
+ CustomArgument(
+ name="test",
+ type=int,
+ dest="test",
+ default=1,
+ required=True,
+ action="store",
+ help="Test argument",
+ nargs=None,
+ choices=None,
+ )
+ ]
+ group = CustomArgumentGroup(name="Test Group", arguments=args)
+ assert group.name == "Test Group"
+ assert len(group.arguments) == 1
+ assert group.arguments[0].name == "test"
+
+
+def test_argparse_translator_setup():
+ """Test the ArgparseTranslator setup."""
+
+ def test_function(test_arg: int):
+ """A test function."""
+ return test_arg * 2
+
+ translator = ArgparseTranslator(func=test_function)
+ parser = translator.parser
+ assert isinstance(parser, ArgumentParser)
+ assert "--test_arg" in parser._option_string_actions
+
+
+def test_argparse_translator_execution():
+ """Test the ArgparseTranslator execution."""
+
+ def test_function(test_arg: int) -> int:
+ """A test function."""
+ return test_arg * 2
+
+ translator = ArgparseTranslator(func=test_function)
+ parsed_args = translator.parser.parse_args(["--test_arg", "3"])
+ result = translator.execute_func(parsed_args)
+ assert result == 6
diff --git a/cli/tests/test_argparse_translator_obbject_registry.py b/cli/tests/test_argparse_translator_obbject_registry.py
new file mode 100644
index 000000000000..a37e5a335415
--- /dev/null
+++ b/cli/tests/test_argparse_translator_obbject_registry.py
@@ -0,0 +1,89 @@
+"""Test OBBject Registry."""
+
+from unittest.mock import Mock
+
+import pytest
+from openbb_cli.argparse_translator.obbject_registry import Registry
+from openbb_core.app.model.obbject import OBBject
+
+# pylint: disable=redefined-outer-name, protected-access
+
+
+@pytest.fixture
+def registry():
+ """Fixture to create a Registry instance for testing."""
+ return Registry()
+
+
+@pytest.fixture
+def mock_obbject():
+ """Fixture to create a mock OBBject for testing."""
+
+ class MockModel:
+ """Mock model for testing."""
+
+ def __init__(self, value):
+ self.mock_value = value
+ self._model_json_schema = "mock_json_schema"
+
+ def model_json_schema(self):
+ return self._model_json_schema
+
+ obb = Mock(spec=OBBject)
+ obb.id = "123"
+ obb.provider = "test_provider"
+ obb.extra = {"command": "test_command"}
+ obb._route = "/test/route"
+ obb._standard_params = Mock()
+ obb._standard_params.__dict__ = {}
+ obb.results = [MockModel(1), MockModel(2)]
+ return obb
+
+
+def test_listing_all_obbjects(registry, mock_obbject):
+ """Test listing all obbjects with additional properties."""
+ registry.register(mock_obbject)
+
+ all_obbjects = registry.all
+ assert len(all_obbjects) == 1
+ assert all_obbjects[0]["command"] == "test_command"
+ assert all_obbjects[0]["provider"] == "test_provider"
+
+
+def test_registry_initialization(registry):
+ """Test the Registry is initialized correctly."""
+ assert registry.obbjects == []
+
+
+def test_register_new_obbject(registry, mock_obbject):
+ """Test registering a new OBBject."""
+ registry.register(mock_obbject)
+ assert mock_obbject in registry.obbjects
+
+
+def test_register_duplicate_obbject(registry, mock_obbject):
+ """Test that duplicate OBBjects are not added."""
+ registry.register(mock_obbject)
+ registry.register(mock_obbject)
+ assert len(registry.obbjects) == 1
+
+
+def test_get_obbject_by_index(registry, mock_obbject):
+ """Test retrieving an obbject by its index."""
+ registry.register(mock_obbject)
+ retrieved = registry.get(0)
+ assert retrieved == mock_obbject
+
+
+def test_remove_obbject_by_index(registry, mock_obbject):
+ """Test removing an obbject by index."""
+ registry.register(mock_obbject)
+ registry.remove(0)
+ assert mock_obbject not in registry.obbjects
+
+
+def test_remove_last_obbject_by_default(registry, mock_obbject):
+ """Test removing the last obbject by default."""
+ registry.register(mock_obbject)
+ registry.remove()
+ assert not registry.obbjects
diff --git a/cli/tests/test_cli.py b/cli/tests/test_cli.py
new file mode 100644
index 000000000000..1fe19344f0f7
--- /dev/null
+++ b/cli/tests/test_cli.py
@@ -0,0 +1,45 @@
+"""Test the CLI module."""
+
+from unittest.mock import patch
+
+from openbb_cli.cli import main
+
+
+@patch("openbb_cli.cli.bootstrap")
+@patch("openbb_cli.cli.launch")
+@patch("sys.argv", ["openbb", "--dev", "--debug"])
+def test_main_with_dev_and_debug(mock_launch, mock_bootstrap):
+ """Test the main function with dev and debug flags."""
+ main()
+ mock_bootstrap.assert_called_once()
+ mock_launch.assert_called_once_with(True, True)
+
+
+@patch("openbb_cli.cli.bootstrap")
+@patch("openbb_cli.cli.launch")
+@patch("sys.argv", ["openbb"])
+def test_main_without_arguments(mock_launch, mock_bootstrap):
+ """Test the main function without arguments."""
+ main()
+ mock_bootstrap.assert_called_once()
+ mock_launch.assert_called_once_with(False, False)
+
+
+@patch("openbb_cli.cli.bootstrap")
+@patch("openbb_cli.cli.launch")
+@patch("sys.argv", ["openbb", "--dev"])
+def test_main_with_dev_only(mock_launch, mock_bootstrap):
+ """Test the main function with dev flag only."""
+ main()
+ mock_bootstrap.assert_called_once()
+ mock_launch.assert_called_once_with(True, False)
+
+
+@patch("openbb_cli.cli.bootstrap")
+@patch("openbb_cli.cli.launch")
+@patch("sys.argv", ["openbb", "--debug"])
+def test_main_with_debug_only(mock_launch, mock_bootstrap):
+ """Test the main function with debug flag only."""
+ main()
+ mock_bootstrap.assert_called_once()
+ mock_launch.assert_called_once_with(False, True)
diff --git a/cli/tests/test_config_completer.py b/cli/tests/test_config_completer.py
new file mode 100644
index 000000000000..71efad99d5b8
--- /dev/null
+++ b/cli/tests/test_config_completer.py
@@ -0,0 +1,78 @@
+"""Test the Config completer."""
+
+import pytest
+from openbb_cli.config.completer import WordCompleter
+from prompt_toolkit.completion import CompleteEvent
+from prompt_toolkit.document import Document
+
+# pylint: disable=redefined-outer-name, import-outside-toplevel
+
+
+@pytest.fixture
+def word_completer():
+ """Return a simple word completer."""
+ words = ["test", "example", "demo"]
+ return WordCompleter(words, ignore_case=True)
+
+
+def test_word_completer_simple(word_completer):
+ """Test the word completer with a simple word list."""
+ doc = Document(text="ex", cursor_position=2)
+ completions = list(word_completer.get_completions(doc, CompleteEvent()))
+ assert len(completions) == 1
+ assert completions[0].text == "example"
+
+
+def test_word_completer_case_insensitive(word_completer):
+ """Test the word completer with case-insensitive matching."""
+ doc = Document(text="Ex", cursor_position=2)
+ completions = list(word_completer.get_completions(doc, CompleteEvent()))
+ assert len(completions) == 1
+ assert completions[0].text == "example"
+
+
+def test_word_completer_no_match(word_completer):
+ """Test the word completer with no matches."""
+ doc = Document(text="xyz", cursor_position=3)
+ completions = list(word_completer.get_completions(doc, CompleteEvent()))
+ assert len(completions) == 0
+
+
+@pytest.fixture
+def nested_completer():
+ """Return a nested completer."""
+ from openbb_cli.config.completer import NestedCompleter
+
+ data = {
+ "show": {
+ "version": None,
+ "interfaces": None,
+ "clock": None,
+ "ip": {"interface": {"brief": None}},
+ },
+ "exit": None,
+ "enable": None,
+ }
+ return NestedCompleter.from_nested_dict(data)
+
+
+def test_nested_completer_root_command(nested_completer):
+ """Test the nested completer with a root command."""
+ doc = Document(text="sh", cursor_position=2)
+ completions = list(nested_completer.get_completions(doc, CompleteEvent()))
+ assert "show" in [c.text for c in completions]
+
+
+def test_nested_completer_sub_command(nested_completer):
+ """Test the nested completer with a sub-command."""
+ doc = Document(text="show ", cursor_position=5)
+ completions = list(nested_completer.get_completions(doc, CompleteEvent()))
+ assert "version" in [c.text for c in completions]
+ assert "interfaces" in [c.text for c in completions]
+
+
+def test_nested_completer_no_match(nested_completer):
+ """Test the nested completer with no matches."""
+ doc = Document(text="random ", cursor_position=7)
+ completions = list(nested_completer.get_completions(doc, CompleteEvent()))
+ assert len(completions) == 0
diff --git a/cli/tests/test_config_console.py b/cli/tests/test_config_console.py
new file mode 100644
index 000000000000..60ff91a88ac1
--- /dev/null
+++ b/cli/tests/test_config_console.py
@@ -0,0 +1,47 @@
+"""Test Config Console."""
+
+from unittest.mock import patch
+
+import pytest
+from openbb_cli.config.console import Console
+from rich.text import Text
+
+# pylint: disable=redefined-outer-name, unused-argument, unused-variable, protected-access
+
+
+@pytest.fixture
+def mock_settings():
+ """Mock settings to inject into Console."""
+
+ class MockSettings:
+ TEST_MODE = False
+ ENABLE_RICH_PANEL = True
+ SHOW_VERSION = True
+ VERSION = "1.0"
+
+ return MockSettings()
+
+
+@pytest.fixture
+def console(mock_settings):
+ """Create a Console instance with mocked settings."""
+ with patch("rich.console.Console") as MockRichConsole: # noqa: F841
+ return Console(settings=mock_settings)
+
+
+def test_print_without_panel(console, mock_settings):
+ """Test printing without a rich panel when disabled."""
+ mock_settings.ENABLE_RICH_PANEL = False
+ with patch.object(console._console, "print") as mock_print:
+ console.print(text="Hello, world!", menu="Home Menu")
+ mock_print.assert_called_once_with("Hello, world!")
+
+
+def test_blend_text():
+ """Test blending text colors."""
+ message = "Hello"
+ color1 = (255, 0, 0) # Red
+ color2 = (0, 0, 255) # Blue
+ blended_text = Console._blend_text(message, color1, color2)
+ assert isinstance(blended_text, Text)
+ assert "Hello" in blended_text.plain
diff --git a/cli/tests/test_config_menu_text.py b/cli/tests/test_config_menu_text.py
new file mode 100644
index 000000000000..10956ccbac55
--- /dev/null
+++ b/cli/tests/test_config_menu_text.py
@@ -0,0 +1,68 @@
+"""Test Config Menu Text."""
+
+import pytest
+from openbb_cli.config.menu_text import MenuText
+
+# pylint: disable=redefined-outer-name, protected-access
+
+
+@pytest.fixture
+def menu_text():
+ """Fixture to create a MenuText instance for testing."""
+ return MenuText(path="/test/path")
+
+
+def test_initialization(menu_text):
+ """Test initialization of the MenuText class."""
+ assert menu_text.menu_text == ""
+ assert menu_text.menu_path == "/test/path"
+ assert menu_text.warnings == []
+
+
+def test_add_raw(menu_text):
+ """Test adding raw text."""
+ menu_text.add_raw("Example raw text")
+ assert "Example raw text" in menu_text.menu_text
+
+
+def test_add_info(menu_text):
+ """Test adding informational text."""
+ menu_text.add_info("Info text")
+ assert "[info]Info text:[/info]" in menu_text.menu_text
+
+
+def test_add_cmd(menu_text):
+ """Test adding a command."""
+ menu_text.add_cmd("command", "Performs an action")
+ assert "command" in menu_text.menu_text
+ assert "Performs an action" in menu_text.menu_text
+
+
+def test_format_cmd_name(menu_text):
+ """Test formatting of command names that are too long."""
+ long_name = "x" * 50 # Assuming CMD_NAME_LENGTH is 23
+ formatted_name = menu_text._format_cmd_name(long_name)
+ assert len(formatted_name) <= menu_text.CMD_NAME_LENGTH
+ assert menu_text.warnings # Check that a warning was added
+
+
+def test_format_cmd_description(menu_text):
+ """Test truncation of long descriptions."""
+ long_description = "y" * 100 # Assuming CMD_DESCRIPTION_LENGTH is 65
+ formatted_description = menu_text._format_cmd_description("cmd", long_description)
+ assert len(formatted_description) <= menu_text.CMD_DESCRIPTION_LENGTH
+
+
+def test_add_menu(menu_text):
+ """Test adding a menu item."""
+ menu_text.add_menu("Settings", "Configure your settings")
+ assert "Settings" in menu_text.menu_text
+ assert "Configure your settings" in menu_text.menu_text
+
+
+def test_add_setting(menu_text):
+ """Test adding a setting."""
+ menu_text.add_setting("Enable Feature", True, "Feature description")
+ assert "Enable Feature" in menu_text.menu_text
+ assert "Feature description" in menu_text.menu_text
+ assert "[green]" in menu_text.menu_text
diff --git a/cli/tests/test_config_setup.py b/cli/tests/test_config_setup.py
new file mode 100644
index 000000000000..7c01469063b4
--- /dev/null
+++ b/cli/tests/test_config_setup.py
@@ -0,0 +1,49 @@
+"""Test the Config Setup."""
+
+from unittest.mock import patch
+
+import pytest
+from openbb_cli.config.setup import bootstrap
+
+# pylint: disable=unused-variable
+
+
+def test_bootstrap_creates_directory_and_file():
+ """Test that bootstrap creates the settings directory and environment file."""
+ with patch("pathlib.Path.mkdir") as mock_mkdir, patch(
+ "pathlib.Path.touch"
+ ) as mock_touch:
+ bootstrap()
+ mock_mkdir.assert_called_once_with(parents=True, exist_ok=True)
+ mock_touch.assert_called_once_with(exist_ok=True)
+
+
+def test_bootstrap_directory_exists():
+ """Test bootstrap when the directory already exists."""
+ with patch("pathlib.Path.mkdir") as mock_mkdir, patch(
+ "pathlib.Path.touch"
+ ) as mock_touch:
+ bootstrap()
+ mock_mkdir.assert_called_once_with(parents=True, exist_ok=True)
+ mock_touch.assert_called_once_with(exist_ok=True)
+
+
+def test_bootstrap_file_exists():
+ """Test bootstrap when the environment file already exists."""
+ with patch("pathlib.Path.mkdir") as mock_mkdir, patch(
+ "pathlib.Path.touch"
+ ) as mock_touch:
+ bootstrap()
+ mock_mkdir.assert_called_once_with(parents=True, exist_ok=True)
+ mock_touch.assert_called_once_with(exist_ok=True)
+
+
+def test_bootstrap_permission_error():
+ """Test bootstrap handles permission errors gracefully."""
+ with patch("pathlib.Path.mkdir") as mock_mkdir, patch(
+ "pathlib.Path.touch"
+ ) as mock_touch, pytest.raises( # noqa: F841
+ PermissionError
+ ):
+ mock_mkdir.side_effect = PermissionError("No permission to create directory")
+ bootstrap() # Expecting to raise a PermissionError and be caught by pytest.raises
diff --git a/cli/tests/test_config_style.py b/cli/tests/test_config_style.py
new file mode 100644
index 000000000000..72e9c2a2f38f
--- /dev/null
+++ b/cli/tests/test_config_style.py
@@ -0,0 +1,60 @@
+"""Test Config Style."""
+
+from pathlib import Path
+from unittest.mock import MagicMock, patch
+
+import pytest
+from openbb_cli.config.style import Style
+
+# pylint: disable=redefined-outer-name, protected-access
+
+
+@pytest.fixture
+def mock_style_directory(tmp_path):
+ """Fixture to create a mock styles directory."""
+ (tmp_path / "styles" / "default").mkdir(parents=True, exist_ok=True)
+ return tmp_path / "styles"
+
+
+@pytest.fixture
+def style(mock_style_directory):
+ """Fixture to create a Style instance for testing."""
+ return Style(directory=mock_style_directory)
+
+
+def test_initialization(style):
+ """Test that Style class initializes with default properties."""
+ assert style.line_width == 1.5
+ assert isinstance(style.console_style, dict)
+
+
+@patch("pathlib.Path.exists", MagicMock(return_value=True))
+@patch("pathlib.Path.rglob")
+def test_load_styles(mock_rglob, style, mock_style_directory):
+ """Test loading styles from directories."""
+ mock_rglob.return_value = [mock_style_directory / "default" / "dark.richstyle.json"]
+ style._load(mock_style_directory)
+ assert "dark" in style.console_styles_available
+
+
+@patch("builtins.open", new_callable=MagicMock)
+@patch("json.load", MagicMock(return_value={"background": "black"}))
+def test_from_json(mock_open, style, mock_style_directory):
+ """Test loading style from a JSON file."""
+ json_file = mock_style_directory / "dark.richstyle.json"
+ result = style._from_json(json_file)
+ assert result == {"background": "black"}
+ mock_open.assert_called_once_with(json_file)
+
+
+def test_apply_invalid_style(style, mock_style_directory, capsys):
+ """Test applying an invalid style and falling back to default."""
+ style.apply("nonexistent", mock_style_directory)
+ captured = capsys.readouterr()
+ assert "Invalid console style" in captured.out
+
+
+def test_available_styles(style):
+ """Test listing available styles."""
+ style.console_styles_available = {"dark": Path("/path/to/dark.richstyle.json")}
+ assert "dark" in style.available_styles
diff --git a/cli/tests/test_controllers_base_controller.py b/cli/tests/test_controllers_base_controller.py
new file mode 100644
index 000000000000..465a5b61e5e6
--- /dev/null
+++ b/cli/tests/test_controllers_base_controller.py
@@ -0,0 +1,79 @@
+"""Test the base controller."""
+
+from unittest.mock import MagicMock, patch
+
+import pytest
+from openbb_cli.controllers.base_controller import BaseController
+
+# pylint: disable=unused-argument, unused-variable
+
+
+class TestableBaseController(BaseController):
+ """Testable Base Controller."""
+
+ def __init__(self, queue=None):
+ """Initialize the TestableBaseController."""
+ self.PATH = "/valid/path/"
+ super().__init__(queue=queue)
+
+ def print_help(self):
+ """Print help."""
+
+
+def test_base_controller_initialization():
+ """Test the initialization of the base controller."""
+ with patch.object(TestableBaseController, "check_path", return_value=None):
+ controller = TestableBaseController()
+ assert controller.path == ["valid", "path"] # Checking for correct path split
+
+
+def test_path_validation():
+ """Test the path validation method."""
+ controller = TestableBaseController()
+
+ with pytest.raises(ValueError):
+ controller.PATH = "invalid/path"
+ controller.check_path()
+
+ with pytest.raises(ValueError):
+ controller.PATH = "/invalid/path"
+ controller.check_path()
+
+ with pytest.raises(ValueError):
+ controller.PATH = "/Invalid/Path/"
+ controller.check_path()
+
+ controller.PATH = "/valid/path/"
+
+
+def test_parse_input():
+ """Test the parse input method."""
+ controller = TestableBaseController()
+ input_str = "cmd1/cmd2/cmd3"
+ expected = ["cmd1", "cmd2", "cmd3"]
+ result = controller.parse_input(input_str)
+ assert result == expected
+
+
+def test_switch():
+ """Test the switch method."""
+ controller = TestableBaseController()
+ with patch.object(controller, "call_exit", MagicMock()) as mock_exit:
+ controller.queue = ["exit"]
+ controller.switch("exit")
+ mock_exit.assert_called_once()
+
+
+def test_call_help():
+ """Test the call help method."""
+ controller = TestableBaseController()
+ with patch("openbb_cli.controllers.base_controller.session.console.print"):
+ controller.call_help(None)
+
+
+def test_call_exit():
+ """Test the call exit method."""
+ controller = TestableBaseController()
+ with patch.object(controller, "save_class", MagicMock()):
+ controller.queue = ["quit"]
+ controller.call_exit(None)
diff --git a/cli/tests/test_controllers_base_platform_controller.py b/cli/tests/test_controllers_base_platform_controller.py
new file mode 100644
index 000000000000..cabfe44cd6bd
--- /dev/null
+++ b/cli/tests/test_controllers_base_platform_controller.py
@@ -0,0 +1,70 @@
+"""Test the BasePlatformController."""
+
+from unittest.mock import MagicMock, patch
+
+import pytest
+from openbb_cli.controllers.base_platform_controller import PlatformController, Session
+
+# pylint: disable=redefined-outer-name, protected-access, unused-argument, unused-variable
+
+
+@pytest.fixture
+def mock_session():
+ """Mock session fixture."""
+ with patch(
+ "openbb_cli.controllers.base_platform_controller.session",
+ MagicMock(spec=Session),
+ ) as mock:
+ yield mock
+
+
+def test_initialization_with_valid_params(mock_session):
+ """Test the initialization of the BasePlatformController."""
+ translators = {"dummy_translator": MagicMock()}
+ controller = PlatformController(
+ name="test", parent_path=["parent"], translators=translators
+ )
+ assert controller._name == "test"
+ assert controller.translators == translators
+
+
+def test_initialization_without_required_params():
+ """Test the initialization of the BasePlatformController without required params."""
+ with pytest.raises(ValueError):
+ PlatformController(name="test", parent_path=["parent"])
+
+
+def test_command_generation(mock_session):
+ """Test the command generation method."""
+ translator = MagicMock()
+ translators = {"test_command": translator}
+ controller = PlatformController(
+ name="test", parent_path=["parent"], translators=translators
+ )
+
+ # Check if command function is correctly linked
+ assert "test_command" in controller.translators
+
+
+def test_print_help(mock_session):
+ """Test the print help method."""
+ translators = {"test_command": MagicMock()}
+ controller = PlatformController(
+ name="test", parent_path=["parent"], translators=translators
+ )
+
+ with patch(
+ "openbb_cli.controllers.base_platform_controller.MenuText"
+ ) as mock_menu_text:
+ controller.print_help()
+ mock_menu_text.assert_called_once_with("/parent/test/")
+
+
+def test_sub_controller_generation(mock_session):
+ """Test the sub controller generation method."""
+ translators = {"test_menu_item": MagicMock()}
+ controller = PlatformController(
+ name="test", parent_path=["parent"], translators=translators
+ )
+
+ assert "test_menu_item" in controller.translators
diff --git a/cli/tests/test_controllers_choices.py b/cli/tests/test_controllers_choices.py
new file mode 100644
index 000000000000..6d604751b1f6
--- /dev/null
+++ b/cli/tests/test_controllers_choices.py
@@ -0,0 +1,51 @@
+"""Test the choices controller."""
+
+from argparse import ArgumentParser
+from unittest.mock import patch
+
+import pytest
+from openbb_cli.controllers.choices import (
+ build_controller_choice_map,
+)
+
+# pylint: disable=redefined-outer-name, protected-access, unused-argument, unused-variable
+
+
+class MockController:
+ """Mock controller class for testing."""
+
+ CHOICES_COMMANDS = ["test_command"]
+ controller_choices = ["test_command", "help"]
+
+ def call_test_command(self, args):
+ """Mock function for test_command."""
+ parser = ArgumentParser()
+ parser.add_argument(
+ "--example", choices=["option1", "option2"], help="Example argument."
+ )
+ return parser.parse_args(args)
+
+
+@pytest.fixture
+def mock_controller():
+ """Mock controller fixture."""
+ return MockController()
+
+
+def test_build_command_choice_map(mock_controller):
+ """Test the building of a command choice map."""
+ with patch(
+ "openbb_cli.controllers.choices._get_argument_parser"
+ ) as mock_get_parser:
+ parser = ArgumentParser()
+ parser.add_argument(
+ "--option", choices=["opt1", "opt2"], help="A choice option."
+ )
+ mock_get_parser.return_value = parser
+
+ choice_map = build_controller_choice_map(controller=mock_controller)
+
+ assert "test_command" in choice_map
+ assert "--option" in choice_map["test_command"]
+ assert "opt1" in choice_map["test_command"]["--option"]
+ assert "opt2" in choice_map["test_command"]["--option"]
diff --git a/cli/tests/test_controllers_cli_controller.py b/cli/tests/test_controllers_cli_controller.py
new file mode 100644
index 000000000000..7cb7c6578a92
--- /dev/null
+++ b/cli/tests/test_controllers_cli_controller.py
@@ -0,0 +1,79 @@
+"""Test the CLI controller."""
+
+from unittest.mock import MagicMock, patch
+
+import pytest
+from openbb_cli.controllers.cli_controller import (
+ CLIController,
+ handle_job_cmds,
+ parse_and_split_input,
+ run_cli,
+)
+
+# pylint: disable=redefined-outer-name, unused-argument
+
+
+def test_parse_and_split_input_custom_filters():
+ """Test the parse_and_split_input function with custom filters."""
+ input_cmd = "query -q AAPL/P"
+ result = parse_and_split_input(
+ input_cmd, custom_filters=[r"((\ -q |\ --question|\ ).*?(/))"]
+ )
+ assert (
+ "AAPL/P" not in result
+ ), "Should filter out terms that look like a sorting parameter"
+
+
+@patch("openbb_cli.controllers.cli_controller.CLIController.print_help")
+def test_cli_controller_print_help(mock_print_help):
+ """Test the CLIController print_help method."""
+ controller = CLIController()
+ controller.print_help()
+ mock_print_help.assert_called_once()
+
+
+@pytest.mark.parametrize(
+ "controller_input, expected_output",
+ [
+ ("settings", True),
+ ("random_command", False),
+ ],
+)
+def test_CLIController_has_command(controller_input, expected_output):
+ """Test the CLIController has_command method."""
+ controller = CLIController()
+ assert hasattr(controller, f"call_{controller_input}") == expected_output
+
+
+def test_handle_job_cmds_with_export_path():
+ """Test the handle_job_cmds function with an export path."""
+ jobs_cmds = ["export /path/to/export some_command"]
+ result = handle_job_cmds(jobs_cmds)
+ expected = "some_command"
+ assert expected in result[0] # type: ignore
+
+
+@patch("openbb_cli.controllers.cli_controller.CLIController.switch", return_value=[])
+@patch("openbb_cli.controllers.cli_controller.print_goodbye")
+def test_run_cli_quit_command(mock_print_goodbye, mock_switch):
+ """Test the run_cli function with the quit command."""
+ run_cli(["quit"], test_mode=True)
+ mock_print_goodbye.assert_called_once()
+
+
+@pytest.mark.skip("This test is not working as expected")
+def test_execute_openbb_routine_with_mocked_requests():
+ """Test the call_exe function with mocked requests."""
+ with patch("requests.get") as mock_get:
+ response = MagicMock()
+ response.status_code = 200
+ response.json.return_value = {"script": "print('Hello World')"}
+ mock_get.return_value = response
+ # Here we need to call the correct function, assuming it's something like `call_exe` for URL-based scripts
+ controller = CLIController()
+ controller.call_exe(
+ ["--url", "https://my.openbb.co/u/test/routine/test.openbb"]
+ )
+ mock_get.assert_called_with(
+ "https://my.openbb.co/u/test/routine/test.openbb?raw=true", timeout=10
+ )
diff --git a/cli/tests/test_controllers_controller_factory.py b/cli/tests/test_controllers_controller_factory.py
new file mode 100644
index 000000000000..8832885b47af
--- /dev/null
+++ b/cli/tests/test_controllers_controller_factory.py
@@ -0,0 +1,61 @@
+"""Test the Controller Factory."""
+
+from unittest.mock import MagicMock, patch
+
+import pytest
+from openbb_cli.controllers.platform_controller_factory import (
+ PlatformControllerFactory,
+)
+
+# pylint: disable=redefined-outer-name, unused-argument
+
+
+@pytest.fixture
+def mock_processor():
+ """Fixture to mock ArgparseClassProcessor."""
+ with patch(
+ "openbb_cli.controllers.platform_controller_factory.ArgparseClassProcessor"
+ ) as mock:
+ instance = mock.return_value
+ instance.paths = {"settings": "menu"}
+ instance.translators = {"test_router_settings": MagicMock()}
+ yield instance
+
+
+@pytest.fixture
+def platform_router():
+ """Fixture to provide a mock platform_router class."""
+
+ class MockRouter:
+ pass
+
+ return MockRouter
+
+
+@pytest.fixture
+def factory(platform_router, mock_processor):
+ """Fixture to create a PlatformControllerFactory with mocked dependencies."""
+ return PlatformControllerFactory(
+ platform_router=platform_router, reference={"test": "ref"}
+ )
+
+
+def test_init(mock_processor):
+ """Test the initialization of the PlatformControllerFactory."""
+ factory = PlatformControllerFactory(
+ platform_router=MagicMock(), reference={"test": "ref"}
+ )
+ assert factory.router_name.lower() == "magicmock"
+ assert factory.controller_name == "MagicmockController"
+
+
+def test_create_controller(factory):
+ """Test the creation of a controller class."""
+ ControllerClass = factory.create()
+
+ assert "PlatformController" in [base.__name__ for base in ControllerClass.__bases__]
+ assert ControllerClass.CHOICES_GENERATION
+ assert "settings" in ControllerClass.CHOICES_MENUS
+ assert "test_router_settings" not in [
+ cmd.replace("test_router_", "") for cmd in ControllerClass.CHOICES_COMMANDS
+ ]
diff --git a/cli/tests/test_controllers_script_parser.py b/cli/tests/test_controllers_script_parser.py
new file mode 100644
index 000000000000..4363b0d79fe0
--- /dev/null
+++ b/cli/tests/test_controllers_script_parser.py
@@ -0,0 +1,106 @@
+"""Test Script parser."""
+
+from datetime import datetime, timedelta
+
+import pytest
+from openbb_cli.controllers.script_parser import (
+ match_and_return_openbb_keyword_date,
+ parse_openbb_script,
+)
+
+# pylint: disable=import-outside-toplevel, unused-variable, line-too-long
+
+
+@pytest.mark.parametrize(
+ "command, expected",
+ [
+ ("reset", True),
+ ("r", True),
+ ("r\n", True),
+ ("restart", False),
+ ],
+)
+def test_is_reset(command, expected):
+ """Test the is_reset function."""
+ from openbb_cli.controllers.script_parser import is_reset
+
+ assert is_reset(command) == expected
+
+
+@pytest.mark.parametrize(
+ "keyword, expected_date",
+ [
+ (
+ "$LASTFRIDAY",
+ (
+ datetime.now()
+ - timedelta(days=((datetime.now().weekday() - 4) % 7 + 7) % 7)
+ ).strftime("%Y-%m-%d"),
+ ),
+ ],
+)
+def test_match_and_return_openbb_keyword_date(keyword, expected_date):
+ """Test the match_and_return_openbb_keyword_date function."""
+ result = match_and_return_openbb_keyword_date(keyword)
+ assert result == expected_date
+
+
+def test_parse_openbb_script_basic():
+ """Test the parse_openbb_script function."""
+ raw_lines = ["echo 'Hello World'"]
+ error, script = parse_openbb_script(raw_lines)
+ assert error == ""
+ assert script == "/echo 'Hello World'"
+
+
+def test_parse_openbb_script_with_variable():
+ """Test the parse_openbb_script function."""
+ raw_lines = ["$VAR = 2022-01-01", "echo $VAR"]
+ error, script = parse_openbb_script(raw_lines)
+ assert error == ""
+ assert script == "/echo 2022-01-01"
+
+
+def test_parse_openbb_script_with_foreach_loop():
+ """Test the parse_openbb_script function."""
+ raw_lines = ["foreach $$DATE in 2022-01-01,2022-01-02", "echo $$DATE", "end"]
+ error, script = parse_openbb_script(raw_lines)
+ assert error == ""
+ assert script == "/echo 2022-01-01/echo 2022-01-02"
+
+
+def test_parse_openbb_script_with_error():
+ """Test the parse_openbb_script function."""
+ raw_lines = ["$VAR = ", "echo $VAR"]
+ error, script = parse_openbb_script(raw_lines)
+ assert "Variable $VAR not given" in error
+
+
+@pytest.mark.parametrize(
+ "line, expected",
+ [
+ (
+ "foreach $$VAR in 2022-01-01",
+ "[red]The script has a foreach loop that doesn't terminate. Add the keyword 'end' to explicitly terminate loop[/red]", # noqa: E501
+ ),
+ ("echo Hello World", ""),
+ (
+ "end",
+ "[red]The script has a foreach loop that terminates before it gets started. Add the keyword 'foreach' to explicitly start loop[/red]", # noqa: E501
+ ),
+ ],
+)
+def test_parse_openbb_script_foreach_errors(line, expected):
+ """Test the parse_openbb_script function."""
+ error, script = parse_openbb_script([line])
+ assert error == expected
+
+
+def test_date_keyword_last_friday():
+ """Test the match_and_return_openbb_keyword_date function."""
+ today = datetime.now()
+ last_friday = today - timedelta(days=(today.weekday() - 4 + 7) % 7)
+ if last_friday > today:
+ last_friday -= timedelta(days=7)
+ expected_date = last_friday.strftime("%Y-%m-%d")
+ assert match_and_return_openbb_keyword_date("$LASTFRIDAY") == expected_date
diff --git a/cli/tests/test_controllers_settings_controller.py b/cli/tests/test_controllers_settings_controller.py
new file mode 100644
index 000000000000..439281392057
--- /dev/null
+++ b/cli/tests/test_controllers_settings_controller.py
@@ -0,0 +1,135 @@
+"""Test the SettingsController class."""
+
+from unittest.mock import MagicMock, patch
+
+import pytest
+from openbb_cli.controllers.settings_controller import SettingsController
+
+# pylint: disable=redefined-outer-name, unused-argument
+
+
+@pytest.fixture
+def mock_session():
+ with patch("openbb_cli.controllers.settings_controller.session") as mock:
+
+ mock.settings.USE_INTERACTIVE_DF = False
+ mock.settings.ALLOWED_NUMBER_OF_ROWS = 20
+ mock.settings.TIMEZONE = "UTC"
+
+ mock.settings.set_item = MagicMock()
+
+ yield mock
+
+
+def test_call_interactive(mock_session):
+ controller = SettingsController()
+ controller.call_interactive(None)
+ mock_session.settings.set_item.assert_called_once_with("USE_INTERACTIVE_DF", True)
+
+
+@pytest.mark.parametrize(
+ "input_rows, expected",
+ [
+ (10, 10),
+ (15, 15),
+ ],
+)
+def test_call_n_rows(input_rows, expected, mock_session):
+ controller = SettingsController()
+ args = ["--rows", str(input_rows)]
+ controller.call_n_rows(args)
+ mock_session.settings.set_item.assert_called_with(
+ "ALLOWED_NUMBER_OF_ROWS", expected
+ )
+
+
+def test_call_n_rows_no_args_provided(mock_session):
+ controller = SettingsController()
+ controller.call_n_rows([])
+ mock_session.console.print.assert_called_with("Current number of rows: 20")
+
+
+@pytest.mark.parametrize(
+ "timezone, valid",
+ [
+ ("UTC", True),
+ ("Mars/Phobos", False),
+ ],
+)
+def test_call_timezone(timezone, valid, mock_session):
+ with patch(
+ "openbb_cli.controllers.settings_controller.is_timezone_valid",
+ return_value=valid,
+ ):
+ controller = SettingsController()
+ args = ["--timezone", timezone]
+ controller.call_timezone(args)
+ if valid:
+ mock_session.settings.set_item.assert_called_with("TIMEZONE", timezone)
+ else:
+ mock_session.settings.set_item.assert_not_called()
+
+
+def test_call_console_style(mock_session):
+ controller = SettingsController()
+ args = ["--style", "dark"]
+ controller.call_console_style(args)
+ mock_session.console.print.assert_called()
+
+
+def test_call_console_style_no_args(mock_session):
+ mock_session.settings.RICH_STYLE = "default"
+ controller = SettingsController()
+ controller.call_console_style([])
+ mock_session.console.print.assert_called_with("Current console style: default")
+
+
+def test_call_flair(mock_session):
+ controller = SettingsController()
+ args = ["--flair", "rocket"]
+ controller.call_flair(args)
+
+
+def test_call_flair_no_args(mock_session):
+ mock_session.settings.FLAIR = "star"
+ controller = SettingsController()
+ controller.call_flair([])
+ mock_session.console.print.assert_called_with("Current flair: star")
+
+
+def test_call_obbject_display(mock_session):
+ controller = SettingsController()
+ args = ["--number", "5"]
+ controller.call_obbject_display(args)
+ mock_session.settings.set_item.assert_called_once_with(
+ "N_TO_DISPLAY_OBBJECT_REGISTRY", 5
+ )
+
+
+def test_call_obbject_display_no_args(mock_session):
+ mock_session.settings.N_TO_DISPLAY_OBBJECT_REGISTRY = 10
+ controller = SettingsController()
+ controller.call_obbject_display([])
+ mock_session.console.print.assert_called_with(
+ "Current number of results to display from the OBBject registry: 10"
+ )
+
+
+@pytest.mark.parametrize(
+ "args, expected",
+ [
+ (["--rows", "50"], 50),
+ (["--rows", "100"], 100),
+ ([], 20),
+ ],
+)
+def test_call_n_rows_v2(args, expected, mock_session):
+ mock_session.settings.ALLOWED_NUMBER_OF_ROWS = 20
+ controller = SettingsController()
+ controller.call_n_rows(args)
+ if args:
+ mock_session.settings.set_item.assert_called_with(
+ "ALLOWED_NUMBER_OF_ROWS", expected
+ )
+ else:
+ mock_session.console.print.assert_called_with("Current number of rows: 20")
diff --git a/cli/tests/test_controllers_utils.py b/cli/tests/test_controllers_utils.py
new file mode 100644
index 000000000000..84c7548c9df8
--- /dev/null
+++ b/cli/tests/test_controllers_utils.py
@@ -0,0 +1,157 @@
+"""Test the Controller utils."""
+
+import argparse
+from pathlib import Path
+from unittest.mock import MagicMock, patch
+
+import pytest
+from openbb_cli.controllers.utils import (
+ check_non_negative,
+ check_positive,
+ get_flair_and_username,
+ get_user_agent,
+ parse_and_split_input,
+ print_goodbye,
+ print_guest_block_msg,
+ remove_file,
+ reset,
+ welcome_message,
+)
+
+# pylint: disable=redefined-outer-name, unused-argument
+
+
+@pytest.fixture
+def mock_session():
+ """Mock the session and its dependencies."""
+ with patch("openbb_cli.controllers.utils.Session", autospec=True) as mock:
+ mock.return_value.console.print = MagicMock()
+ mock.return_value.is_local = MagicMock(return_value=True)
+ mock.return_value.settings.VERSION = "1.0"
+ mock.return_value.user.profile.hub_session.username = "testuser"
+ mock.return_value.settings.FLAIR = "rocket"
+ yield mock
+
+
+def test_remove_file_existing_file():
+ """Test removing an existing file."""
+ with patch("os.path.isfile", return_value=True), patch("os.remove") as mock_remove:
+ assert remove_file(Path("/path/to/file"))
+ mock_remove.assert_called_once()
+
+
+def test_remove_file_directory():
+ """Test removing a directory."""
+ with patch("os.path.isfile", return_value=False), patch(
+ "os.path.isdir", return_value=True
+ ), patch("shutil.rmtree") as mock_rmtree:
+ assert remove_file(Path("/path/to/directory"))
+ mock_rmtree.assert_called_once()
+
+
+def test_remove_file_failure(mock_session):
+ """Test removing a file that fails."""
+ with patch("os.path.isfile", return_value=True), patch(
+ "os.remove", side_effect=Exception("Error")
+ ):
+ assert not remove_file(Path("/path/to/file"))
+ mock_session.return_value.console.print.assert_called()
+
+
+def test_print_goodbye(mock_session):
+ """Test printing the goodbye message."""
+ print_goodbye()
+ mock_session.return_value.console.print.assert_called()
+
+
+def test_reset(mock_session):
+ """Test resetting the CLI."""
+ with patch("openbb_cli.controllers.utils.remove_file"), patch(
+ "sys.modules", new_callable=dict
+ ):
+ reset()
+ mock_session.return_value.console.print.assert_called()
+
+
+def test_parse_and_split_input():
+ """Test parsing and splitting user input."""
+ user_input = "ls -f /home/user/docs/document.xlsx"
+ result = parse_and_split_input(user_input, [])
+ assert "ls" in result[0]
+
+
+@pytest.mark.parametrize(
+ "input_command, expected_output",
+ [
+ ("/", ["home"]),
+ ("ls -f /path/to/file.txt", ["ls -f ", "path", "to", "file.txt"]),
+ ("rm -f /home/user/docs", ["rm -f ", "home", "user", "docs"]),
+ ],
+)
+def test_parse_and_split_input_special_cases(input_command, expected_output):
+ """Test parsing and splitting user input with special cases."""
+ result = parse_and_split_input(input_command, [])
+ assert result == expected_output
+
+
+def test_print_guest_block_msg(mock_session):
+ """Test printing the guest block message."""
+ print_guest_block_msg()
+ mock_session.return_value.console.print.assert_called()
+
+
+def test_welcome_message(mock_session):
+ """Test printing the welcome message."""
+ welcome_message()
+ mock_session.return_value.console.print.assert_called_with(
+ "\nWelcome to OpenBB Platform CLI v1.0"
+ )
+
+
+def test_get_flair_and_username(mock_session):
+ """Test getting the flair and username."""
+ result = get_flair_and_username()
+ assert "testuser" in result
+ assert "rocket" in result #
+
+
+@pytest.mark.parametrize(
+ "value, expected",
+ [
+ ("10", 10),
+ ("0", 0),
+ ("-1", pytest.raises(argparse.ArgumentTypeError)),
+ ("text", pytest.raises(ValueError)),
+ ],
+)
+def test_check_non_negative(value, expected):
+ """Test checking for a non-negative value."""
+ if isinstance(expected, int):
+ assert check_non_negative(value) == expected
+ else:
+ with expected:
+ check_non_negative(value)
+
+
+@pytest.mark.parametrize(
+ "value, expected",
+ [
+ ("1", 1),
+ ("0", pytest.raises(argparse.ArgumentTypeError)),
+ ("-1", pytest.raises(argparse.ArgumentTypeError)),
+ ("text", pytest.raises(ValueError)),
+ ],
+)
+def test_check_positive(value, expected):
+ """Test checking for a positive value."""
+ if isinstance(expected, int):
+ assert check_positive(value) == expected
+ else:
+ with expected:
+ check_positive(value)
+
+
+def test_get_user_agent():
+ """Test getting the user agent."""
+ result = get_user_agent()
+ assert result.startswith("Mozilla/5.0")
diff --git a/cli/tests/test_models_settings.py b/cli/tests/test_models_settings.py
new file mode 100644
index 000000000000..0834355516f4
--- /dev/null
+++ b/cli/tests/test_models_settings.py
@@ -0,0 +1,72 @@
+"""Test the Models Settings module."""
+
+from unittest.mock import mock_open, patch
+
+from openbb_cli.models.settings import Settings
+
+# pylint: disable=unused-argument
+
+
+def test_default_values():
+ """Test the default values of the settings model."""
+ settings = Settings()
+ assert settings.VERSION == "1.0.0"
+ assert settings.TEST_MODE is False
+ assert settings.DEBUG_MODE is False
+ assert settings.DEV_BACKEND is False
+ assert settings.FILE_OVERWRITE is False
+ assert settings.SHOW_VERSION is True
+ assert settings.USE_INTERACTIVE_DF is True
+ assert settings.USE_CLEAR_AFTER_CMD is False
+ assert settings.USE_DATETIME is True
+ assert settings.USE_PROMPT_TOOLKIT is True
+ assert settings.ENABLE_EXIT_AUTO_HELP is True
+ assert settings.REMEMBER_CONTEXTS is True
+ assert settings.ENABLE_RICH_PANEL is True
+ assert settings.TOOLBAR_HINT is True
+ assert settings.SHOW_MSG_OBBJECT_REGISTRY is False
+ assert settings.TIMEZONE == "America/New_York"
+ assert settings.FLAIR == ":openbb"
+ assert settings.PREVIOUS_USE is False
+ assert settings.N_TO_KEEP_OBBJECT_REGISTRY == 10
+ assert settings.N_TO_DISPLAY_OBBJECT_REGISTRY == 5
+ assert settings.RICH_STYLE == "dark"
+ assert settings.ALLOWED_NUMBER_OF_ROWS == 20
+ assert settings.ALLOWED_NUMBER_OF_COLUMNS == 5
+ assert settings.HUB_URL == "https://my.openbb.co"
+ assert settings.BASE_URL == "https://payments.openbb.co"
+
+
+# Test __repr__ output
+def test_repr():
+ """Test the __repr__ method of the settings model."""
+ settings = Settings()
+ repr_str = settings.__repr__() # pylint: disable=C2801
+ assert "Settings\n\n" in repr_str
+ assert "VERSION: 1.0.0" in repr_str
+
+
+# Test loading from environment variables
+@patch(
+ "openbb_cli.models.settings.dotenv_values",
+ return_value={"OPENBB_TEST_MODE": "True", "OPENBB_VERSION": "2.0.0"},
+)
+def test_from_env(mock_dotenv_values):
+ """Test loading settings from environment variables."""
+ settings = Settings.from_env({}) # type: ignore
+ assert settings["TEST_MODE"] == "True"
+ assert settings["VERSION"] == "2.0.0"
+
+
+# Test setting an item and updating .env
+@patch("openbb_cli.models.settings.set_key")
+@patch(
+ "openbb_cli.models.settings.open",
+ new_callable=mock_open,
+ read_data="TEST_MODE=False\n",
+)
+def test_set_item(mock_file, mock_set_key):
+ """Test setting an item and updating the .env file."""
+ settings = Settings()
+ settings.set_item("TEST_MODE", True)
+ assert settings.TEST_MODE is True
diff --git a/cli/tests/test_session.py b/cli/tests/test_session.py
new file mode 100644
index 000000000000..66ca9fccab8b
--- /dev/null
+++ b/cli/tests/test_session.py
@@ -0,0 +1,44 @@
+"Test the Session class."
+from unittest.mock import MagicMock, patch
+
+import pytest
+from openbb_cli.models.settings import Settings
+from openbb_cli.session import Session, sys
+
+# pylint: disable=redefined-outer-name, unused-argument, protected-access
+
+
+def mock_isatty(return_value):
+ """Mock the isatty method."""
+ original_isatty = sys.stdin.isatty
+ sys.stdin.isatty = MagicMock(return_value=return_value) # type: ignore
+ return original_isatty
+
+
+@pytest.fixture
+def session():
+ """Session fixture."""
+ return Session()
+
+
+def test_session_initialization(session):
+ """Test the initialization of the Session class."""
+ assert session.settings is not None
+ assert session.style is not None
+ assert session.console is not None
+ assert session.obbject_registry is not None
+ assert isinstance(session.settings, Settings)
+
+
+@patch("sys.stdin.isatty", return_value=True)
+def test_get_prompt_session_true(mock_isatty, session):
+ "Test get_prompt_session method."
+ prompt_session = session._get_prompt_session()
+ assert prompt_session is not None
+
+
+@patch("sys.stdin.isatty", return_value=False)
+def test_get_prompt_session_false(mock_isatty, session):
+ "Test get_prompt_session method."
+ prompt_session = session._get_prompt_session()
+ assert prompt_session is None
diff --git a/openbb_platform/dev_install.py b/openbb_platform/dev_install.py
index 391aa08fa280..0b8695366fd0 100644
--- a/openbb_platform/dev_install.py
+++ b/openbb_platform/dev_install.py
@@ -129,7 +129,7 @@ def install_local(_extras: bool = False):
print("Restoring pyproject.toml and poetry.lock") # noqa: T201
finally:
- # Revert pyproject.toml and poetry.lock to their original state
+ # Revert pyproject.toml and poetry.lock to their original state.
with open(PYPROJECT, "w", encoding="utf-8", newline="\n") as f:
f.write(original_pyproject)
From 8d060dc0717e2ce9cde06ffc7523ea465c920a0e Mon Sep 17 00:00:00 2001
From: Henrique Joaquim
Date: Tue, 14 May 2024 16:44:07 +0100
Subject: [PATCH 12/13] [Feature] CLI docs (#6362)
* cli docs website
* changes
* remove unused feat flags
* typo
* yeet stuff that can't be used
* some progress
* Add home screenshot
* screenshots.md
* fix links
* new cards for cli pages
* start config page
* more updates
* Add screenshots
* flatten some things.
* fix link
* some more updates
* some routine stuff
* codespell
* cli color
* results in the global commands
* increase codeBlock line-height
* remove platform warning, obb is a class
* minor change, danger warning
* typo?
* Data processing commands
---------
Co-authored-by: Danglewood <85772166+deeleeramone@users.noreply.github.com>
Co-authored-by: Diogo Sousa
---
.../controllers/settings_controller.py | 3 -
website/content/cli/_category_.json | 4 +
website/content/cli/commands-and-arguments.md | 76 ++++++
website/content/cli/configuration.md | 66 +++++
website/content/cli/data-sources.md | 113 ++++++++
website/content/cli/hub.md | 111 ++++++++
website/content/cli/index.md | 78 ++++++
website/content/cli/installation.md | 76 ++++++
website/content/cli/interactive-charts.md | 109 ++++++++
website/content/cli/interactive-tables.md | 75 ++++++
website/content/cli/openbbuserdata.md | 59 +++++
website/content/cli/quickstart.md | 243 ++++++++++++++++++
website/content/cli/routines/_category_.json | 4 +
.../content/cli/routines/advanced-routines.md | 119 +++++++++
.../cli/routines/community-routines.md | 52 ++++
website/content/cli/routines/index.mdx | 31 +++
.../cli/routines/introduction-to-routines.md | 130 ++++++++++
.../cli/routines/routine-macro-recorder.md | 46 ++++
.../content/cli/structure-and-navigation.md | 42 +++
website/content/platform/installation.md | 9 -
website/package-lock.json | 7 +-
website/sidebars.js | 5 +
.../components/General/NewReferenceCard.tsx | 5 +-
.../theme/CodeBlock/Content/styles.module.css | 1 +
.../theme/DocSidebarItem/Category/index.js | 1 +
website/src/theme/Navbar/Layout/index.js | 12 +
26 files changed, 1458 insertions(+), 19 deletions(-)
create mode 100644 website/content/cli/_category_.json
create mode 100644 website/content/cli/commands-and-arguments.md
create mode 100644 website/content/cli/configuration.md
create mode 100644 website/content/cli/data-sources.md
create mode 100644 website/content/cli/hub.md
create mode 100644 website/content/cli/index.md
create mode 100644 website/content/cli/installation.md
create mode 100644 website/content/cli/interactive-charts.md
create mode 100644 website/content/cli/interactive-tables.md
create mode 100644 website/content/cli/openbbuserdata.md
create mode 100644 website/content/cli/quickstart.md
create mode 100644 website/content/cli/routines/_category_.json
create mode 100644 website/content/cli/routines/advanced-routines.md
create mode 100644 website/content/cli/routines/community-routines.md
create mode 100644 website/content/cli/routines/index.mdx
create mode 100644 website/content/cli/routines/introduction-to-routines.md
create mode 100644 website/content/cli/routines/routine-macro-recorder.md
create mode 100644 website/content/cli/structure-and-navigation.md
diff --git a/cli/openbb_cli/controllers/settings_controller.py b/cli/openbb_cli/controllers/settings_controller.py
index 8783ef47e1b7..f93501a5063f 100644
--- a/cli/openbb_cli/controllers/settings_controller.py
+++ b/cli/openbb_cli/controllers/settings_controller.py
@@ -21,10 +21,7 @@ class SettingsController(BaseController):
CHOICES_COMMANDS: List[str] = [
"interactive",
"cls",
- "watermark",
"promptkit",
- "thoughts",
- "reporthtml",
"exithelp",
"rcontext",
"richpanel",
diff --git a/website/content/cli/_category_.json b/website/content/cli/_category_.json
new file mode 100644
index 000000000000..a68e9f9ff3b4
--- /dev/null
+++ b/website/content/cli/_category_.json
@@ -0,0 +1,4 @@
+{
+ "label": "OpenBB CLI",
+ "position": 2
+}
diff --git a/website/content/cli/commands-and-arguments.md b/website/content/cli/commands-and-arguments.md
new file mode 100644
index 000000000000..709b73f3bc95
--- /dev/null
+++ b/website/content/cli/commands-and-arguments.md
@@ -0,0 +1,76 @@
+---
+title: Commands And Arguments
+sidebar_position: 4
+description: This page explains how to enter commands and arguments into the OpenBB CLI.
+keywords:
+- help arguments
+- auto-complete
+- global commands
+- support command
+- reset command
+- command line interface
+- metadata
+- cli
+- parameters
+- functions
+- commands
+- options
+---
+
+import HeadTitle from '@site/src/components/General/HeadTitle.tsx';
+
+
+
+Commands are displayed on-screen in a lighter colour, compared with menu items, and they will not be prefaced with, `>`.
+
+Functions have a variety of parameters that differ by endpoint and provider. The --help dialogue will provide guidance on nuances of any particular command.
+
+The available data sources for each command are displayed on the right side of the screen, and are selected with the `--provider` argument.
+
+## Help arguments
+
+The `help` command shows the current menu. The screen will display all the commands and menus that exist, including a short description for each of these.
+
+Adding `--help`, or `-h`, to any command will display the description and parameters for that particular function.
+
+## Entering Parameters
+
+Parameters are all defined through the same pattern, --argument, followed by a space, and then the value.
+
+If the parameter is a boolean (true/false), there is no value to enter. Adding the --argument flags the parameter to be the opposite of its default state.
+
+Use the auto-complete to prompt choices and reduce the amount of keystrokes required to run a complex function.
+
+## Auto-complete
+
+The OpenBB CLI is equipped with an auto completion engine that presents choices based on the current menu and command. Whenever you start typing, suggestion prompts will appear for existing commands and menus. When the command contains arguments, pressing the `space bar` after typing the command will present the list of available arguments.
+
+This functionality dramatically reduces the number of key strokes required to perform tasks and, in many cases, eliminates the need to consult the help dialogue for reminders. Choices - where they are bound by a defined list - are scrollable with the up and down arrow keys.
+
+## Global commands
+
+These are commands that can be used throughout the CLI and will work regardless of the menu where they belong.
+
+### Help
+
+`--help`, or `-h` can be attached to any command, as described above.
+
+### CLS
+
+The `cls` command clears the entire CLI screen.
+
+### Quit
+
+The `quit` command (can also use `q` or `..`) allows to leave the current menu to go one menu above. If the user is on the root, that will mean leaving the CLI.
+
+### Exit
+
+The `exit` command allows the user to exit the CLI.
+
+### Reset
+
+The `reset` command will reset the CLI to its default state. This is specially useful for development so you can refresh the CLI without having to close and open it again.
+
+### Results
+
+The `results` command will display the stack of `OBBjects` that have been generated during the session, which can be later injected on the data processing commands.
diff --git a/website/content/cli/configuration.md b/website/content/cli/configuration.md
new file mode 100644
index 000000000000..360aebae253f
--- /dev/null
+++ b/website/content/cli/configuration.md
@@ -0,0 +1,66 @@
+---
+title: Configuration & Settings
+sidebar_position: 5
+description: This documentation page details the various settings and feature flags used to customize the OpenBB CLI.
+keywords:
+- Settings Menu
+- Feature Flags Menu
+- customize CLI
+- alter CLI behaviour
+- environment variables
+- Documentation
+- OpenBB Platform CLI
+- preferences
+- user
+---
+
+import HeadTitle from '@site/src/components/General/HeadTitle.tsx';
+
+
+
+In addition to the OpenBB Platform's `user_settings.json` file, described [here](/platform/usage/settings_and_environment_variables), there are settings and environment variables affecting the CLI only.
+
+:::important
+API credentials are defined in the `user_settings.json` file.
+
+Find all data providers [here](/platform/extensions/data_extensions), and manage all your credentials directly on the [OpenBB Hub](https://my.openbb.co/app/platform/credentials).
+
+Define default data sources by following the pattern outlined [here](data-sources)
+:::
+
+## Settings Menu
+
+The `/settings` menu provides methods for customizing the look and feel of the CLI. The menu is divided into two sections:
+
+- Feature Flags
+ - On/Off status is reflected by red/green text.
+ - Status is toggled by entering the item as a command.
+- Preferences
+ - Choices and options will be presented as a typical function.
+
+### Feature Flags
+
+| Feature Flags | Description |
+| :----------- | :--------------------------------------------------------------- |
+| `interactive` | Enable/disable interactive tables. Disabling prints the table directly on the CLI screen. |
+| `cls` | Clear the screen after each command. Default state is off. |
+| `promptkit` | Enable auto complete and history. Default state is on. |
+| `richpanel` | Displays a border around menus. Default state is on. |
+| `tbhint` | Display usage hints in the bottom toolbar. Default state is on. |
+| `exithelp` | Automatically print the screen after navigating back one menu. Default state is off. |
+| `overwrite` | Automatically overwrite exported files with the same name. Default state is off. |
+| `obbject_msg` | Displays a message whenever a new result is added to the registry. Default state is off. |
+| `version` | Displays the currently installed version number in the bottom right corner. |
+
+### Preferences
+
+| Preferences | Description |
+| :----------- | :--------------------------------------------------------------- |
+| `console_style` | apply a custom rich style to the CLI |
+| `flair` | choose flair icon |
+| `timezone` | pick timezone |
+| `language` | translation language |
+| `n_rows` | number of rows to show on non interactive tables |
+| `n_cols` | number of columns to show on non interactive tables |
+| `obbject_res` | define the maximum number of obbjects allowed in the registry |
+| `obbject_display` | define the maximum number of cached results to display on the help menu |
diff --git a/website/content/cli/data-sources.md b/website/content/cli/data-sources.md
new file mode 100644
index 000000000000..f6bd3a0d7626
--- /dev/null
+++ b/website/content/cli/data-sources.md
@@ -0,0 +1,113 @@
+---
+title: Data Sources
+sidebar_position: 7
+description: This page explains how to select a provider for any specific command, and set a default source for a route.
+keywords:
+- Terminal
+- CLI
+- provider
+- API keys
+- FinancialModelingPrep
+- Polygon
+- AlphaVantage
+- Intrinio
+- YahooFinance
+- source
+- data
+- default
+---
+
+import HeadTitle from '@site/src/components/General/HeadTitle.tsx';
+
+
+
+Many commands have multiple data sources associated with it. This page describes how to select from multiple providers.
+
+:::important
+API credentials are defined in the `user_settings.json` file.
+
+Find all data providers [here](/platform/extensions/data_extensions), and manage all your credentials directly on the [OpenBB Hub](https://my.openbb.co/app/platform/credentials).
+:::
+
+## Data Source In-Command
+
+To specify the data vendor for that particular command, use the `--provider` argument.
+
+Parameter choices can be viewed from the help dialogue, `-h` or `--help`.
+
+```console
+/equity/price/historical -h
+```
+
+```console
+usage: historical --symbol SYMBOL [SYMBOL ...] [--interval INTERVAL] [--start_date START_DATE] [--end_date END_DATE] [--chart]
+ [--provider {fmp,intrinio,polygon,tiingo,yfinance}] [--start_time START_TIME] [--end_time END_TIME] [--timezone TIMEZONE]
+ [--source {realtime,delayed,nasdaq_basic}] [--sort {asc,desc}] [--limit LIMIT] [--extended_hours] [--include_actions]
+ [--adjustment {splits_and_dividends,unadjusted,splits_only}] [--adjusted] [--prepost] [-h] [--export EXPORT]
+ [--sheet-name SHEET_NAME [SHEET_NAME ...]]
+
+Get historical price data for a given stock. This includes open, high, low, close, and volume.
+
+options:
+ --interval INTERVAL Time interval of the data to return.
+ --start_date START_DATE
+ Start date of the data, in YYYY-MM-DD format.
+ --end_date END_DATE End date of the data, in YYYY-MM-DD format.
+ --chart Whether to create a chart or not, by default False.
+ --provider {fmp,intrinio,polygon,tiingo,yfinance}
+ The provider to use for the query, by default None.
+ If None, the provider specified in defaults is selected or 'fmp' if there is
+ no default.
+ --extended_hours Include Pre and Post market data. (provider: polygon, yfinance)
+ --adjustment {splits_and_dividends,unadjusted,splits_only}
+ The adjustment factor to apply. Default is splits only. (provider: polygon, yfinance)
+ -h, --help show this help message
+ --export EXPORT Export raw data into csv, json, xlsx and figure into png, jpg, pdf, svg
+ --sheet-name SHEET_NAME [SHEET_NAME ...]
+ Name of excel sheet to save data to. Only valid for .xlsx files.
+
+required arguments:
+ --symbol SYMBOL [SYMBOL ...]
+ Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp, polygon, tiingo, yfinance.
+
+intrinio:
+ --start_time START_TIME
+ Return intervals starting at the specified time on the `start_date` formatted as 'HH:MM:SS'.
+ --end_time END_TIME Return intervals stopping at the specified time on the `end_date` formatted as 'HH:MM:SS'.
+ --timezone TIMEZONE Timezone of the data, in the IANA format (Continent/City).
+ --source {realtime,delayed,nasdaq_basic}
+ The source of the data.
+
+polygon:
+ --sort {asc,desc} Sort order of the data. This impacts the results in combination with the 'limit' parameter. The results are always returned in ascending order by date.
+ --limit LIMIT The number of data entries to return.
+
+yfinance:
+ --include_actions Include dividends and stock splits in results.
+```
+
+:::note
+Provider-specific parameters are listed at the bottom of the print out. They are ignored when entered, if it is not supported by the selected provider.
+:::
+
+## Setting The Default Source
+
+The default data source for each command (where multiple sources are available) can be defined within the user configuration file: `/home/your-user/.openbb_platform/user_settings.json`.
+
+Set the default data provider for the `/equity/price/historical` command by adding the following line to your `user_settings.json` file:
+
+```json
+{
+ "defaults": {
+ "routes": {
+ "/equity/price/historical": {
+ "provider": "fmp"
+ },
+ "/equity/fundamental/balance": {
+ "provider": "polygon"
+ },
+ ...
+ }
+ }
+}
+```
diff --git a/website/content/cli/hub.md b/website/content/cli/hub.md
new file mode 100644
index 000000000000..d7e77fd9e63c
--- /dev/null
+++ b/website/content/cli/hub.md
@@ -0,0 +1,111 @@
+---
+title: Hub Synchronization
+sidebar_position: 6
+description: This page outlines the `/account` menu within the OpenBB CLI, and integrations with the OpenBB Hub.
+keywords:
+- OpenBB Platform CLI
+- OpenBB Hub
+- Registration
+- Login process
+- API Keys management
+- Theme
+- Style
+- Dark
+- Light
+- Script Routines
+- Personal Access Tokens
+- PAT
+- Credentials
+- Customization
+---
+
+import HeadTitle from '@site/src/components/General/HeadTitle.tsx';
+
+
+
+This page outlines the `/account` menu within the OpenBB CLI and integrations with the OpenBB Hub.
+
+## Registration
+
+To get started, you'll need to create an account on the OpenBB Hub by visiting [https://my.openbb.co](https://my.openbb.co)
+
+By registering with the OpenBB Hub, you can easily access our products on multiple devices and maintain consistent settings for an improved user experience.
+
+## Login
+
+Once you're successfully registered on the OpenBB Hub, you can log in to access all the benefits it has to offer.
+
+:::tip
+OpenBB recommends logging in via the Personal Access Token (PAT) method. This revokable token allows users to login without transmitting any personally identifiable information, like an email address, which makes it an ideal solution for shared machines and public network connections.
+:::
+
+To login, enter the `/account` menu and then use the `login` command with your choice of login method.
+
+### PAT
+
+```console
+/account
+login --pat REPLACE_WITH_PAT
+```
+
+### Email & Password
+
+```console
+/account
+login --email my@emailaddress.com --password totallysecurepassword
+```
+
+## API Keys
+
+The OpenBB Platform acts as a mediator between users and data providers.
+
+With an OpenBB Hub account, you can manage your API keys on [this page](https://my.openbb.co/app/platform/credentials).
+
+Upon logging in, the CLI will automatically retrieve the API keys associated with your account.
+
+If you have not saved them on the OpenBB Hub, they will be loaded from your local environment by default.
+
+:::danger
+If an API key is saved on the OpenBB Hub, it will take precedence over the local environment key.
+:::
+
+The CLI will need to be restarted, or refreshed, when changes are made on the Hub.
+
+## Theme Styles
+
+Theme styles correspond to the ability to change the terminal "skin" (i.e. coloring of the `menu`, `commands`, `data source`, `parameters`, `information` and `help`), as well as the chart and table styles.
+
+In the OpenBB Hub, you can select the text colours for the CLI. After customizing:
+- Download the theme to your styles directory (`/home/your-user/OpenBBUserData/styles/user`).
+- Apply it by selecting the style from the `/settings` menu.
+
+```console
+/settings
+console_style -s openbb_config
+```
+
+Replace `openbb_config` with the name of the downloaded (JSON) file.
+
+## Script Routines
+
+The OpenBB Hub allows users to create, edit, manage, and share their script routines that can be run in the OpenBB Platform CLI.
+
+The "Download" button will save the file locally. Add it to `/home/your-user/OpenBBUserData/routines`, for the script to populate as a choice for the `exe` command on next launch.
+
+## Refresh
+
+The `refresh` command will update any changes without the need to logout and login.
+
+```console
+/account
+refresh
+```
+
+## Logout
+
+Logging out will restore any local credentials and preferences defined in the `user_settings.json` file.
+
+```console
+/account
+logout
+```
diff --git a/website/content/cli/index.md b/website/content/cli/index.md
new file mode 100644
index 000000000000..8097697a0884
--- /dev/null
+++ b/website/content/cli/index.md
@@ -0,0 +1,78 @@
+---
+title: Introduction
+sidebar_position: 0
+description: The OpenBB CLI is a command line interface wrapping the OpenBB Platform. It offers a convenient way to interact with the Platform and its extensions, as well as automate data collection via OpenBB Routine Scripts. No experience with Python, or other programming languages, is required.
+keywords:
+- OpenBB
+- CLI
+- Platform
+- data connectors
+- data access
+- data processing
+- third-party data providers
+- introduction
+---
+
+
+
+import NewReferenceCard from "@site/src/components/General/NewReferenceCard";
+import HeadTitle from '@site/src/components/General/HeadTitle.tsx';
+
+
+
+## Overview
+
+The OpenBB CLI is a command line interface wrapping the OpenBB Platform. It offers a convenient way to interact with the Platform and its extensions, as well as automate data collection via OpenBB Routine Scripts.
+
+The CLI is the next iteration of the [OpenBB Terminal](/terminal), and leverages the extendability of the OpenBB Platform architecture in an easy-to-consume and script format.
+
+![CLI Home](https://github.com/OpenBB-finance/OpenBBTerminal/assets/85772166/d1617c3b-c83d-4491-a7bc-986321fd7230)
+
+## Guides & Documentation
+
+
+
+
+
+
+
+
+
+
+
+
+---
+
+Want to contribute? Check out our [Development section](/platform/development).
diff --git a/website/content/cli/installation.md b/website/content/cli/installation.md
new file mode 100644
index 000000000000..51c1819538ab
--- /dev/null
+++ b/website/content/cli/installation.md
@@ -0,0 +1,76 @@
+---
+title: Installation
+sidebar_position: 2
+description: This page provides installation instructions for the OpenBB CLI.
+keywords:
+- OpenBB Platform
+- Python
+- CLI
+- installation
+- pip
+- pypi
+
+---
+
+import HeadTitle from '@site/src/components/General/HeadTitle.tsx';
+
+
+
+## Pre-Requisites
+
+The OpenBB CLI is a wrapper around the [Platform](/platform), and should be installed along side an existing OpenBB installation.
+
+- A Python virtual environment with a version between 3.9 and 3.11, inclusive, is required.
+
+Please refer to the [OpenBB Platform install documentation](/platform/installation) for instructions and more information.
+
+:::info
+If the OpenBB Platform is not already installed, the `openbb-cli` package will install the default components.
+:::
+
+## PyPI
+
+Within your existing OpenBB environment, install `openbb-cli` with:
+
+```console
+pip install openbb-cli
+```
+
+
+The installation script adds `openbb` to the PATH within your Python environment. The application can be launched from any path, as long as the environment is active.
+
+```console
+openbb
+
+Welcome to OpenBB Platform CLI v1.0.0
+```
+
+## Source
+
+Follow the instructions [here](/platform/installation#source) to clone the GitHub repo and install the OpenBB Platform from the source code.
+
+Next, navigate into the folder: `~/OpenBBTerminal/cli`
+
+:::tip
+The Python environment should have `toml` and `poetry` installed.
+
+```bash
+pip install toml poetry
+```
+:::
+
+Finally, enter:
+
+```console
+poetry install
+```
+
+Alternatively, install locally with `pip`:
+
+```bash
+pip install -e .
+```
+
+## Installing New Modules
+
+New extensions, or removals, are automatically added (removed) to the CLI on the next launch.
diff --git a/website/content/cli/interactive-charts.md b/website/content/cli/interactive-charts.md
new file mode 100644
index 000000000000..efd7438808e1
--- /dev/null
+++ b/website/content/cli/interactive-charts.md
@@ -0,0 +1,109 @@
+---
+title: Interactive Charts
+sidebar_position: 9
+description: This page provides a detailed explanation of the OpenBB Interactive Charts. Understand various capabilities including annotation, color modification, drawing tools, data export, and supplementary data overlay.
+keywords:
+- interactive charts
+- PyWry
+- annotation
+- drawing
+- lines
+- modebar
+- plotly
+- data export
+- data overlay
+- editing chart title
+- Toolbar
+- Text Tools
+- Draw Tools
+- Export Tools
+---
+
+import HeadTitle from '@site/src/components/General/HeadTitle.tsx';
+
+
+
+Interactive charts open in a separate window ([PyWry](https://github.com/OpenBB-finance/pywry)). The OpenBB charting library provides interactive and highly customizable charts.
+
+:::tip
+Not all commands have a charting output, the ones that do, will display a chart argument (`--chart`), which will trigger the charting output instead of the default table output.
+
+Example: `equity/price/historical --symbol AAPL --chart`
+:::
+
+
+Charting cheat sheet
+
+![Group 653](https://user-images.githubusercontent.com/85772166/234313541-3d725e1c-ce48-4413-9267-b03571e0eccd.png)
+
+
+
+## Toolbar
+
+![Chart Tools](https://user-images.githubusercontent.com/85772166/233247997-55c03cbd-9ca9-4f5e-b3fb-3e5a9c63b6eb.png)
+
+The toolbar is located at the bottom of the window, and provides methods for:
+
+- Panning and zooming.
+- Modifying the title and axis labels.
+- Adjusting the hover read out.
+- Toggling light/dark mode.
+- Annotating and drawing.
+- Exporting raw data.
+- Saving the chart as an image.
+- Adding supplementary external data as an overlay.
+
+The label for each tool is displayed by holding the mouse over it.
+
+The toolbar's visibility can be toggled utilizing the `ctrl + h` shortcut.
+
+## Text Tools
+
+Annotate a chart by clicking on the `Add Text` button, or with the keyboard, `ctrl + t`.
+
+![Annotate Charts](https://user-images.githubusercontent.com/85772166/233248056-d459d7a0-ba2d-4533-896a-79406ded859e.png)
+
+Enter some text, make any adjustments to the options, then `submit`. Place the crosshairs over the desired data point and click to place the text.
+
+![Place Text](https://user-images.githubusercontent.com/85772166/233728645-74734241-4da2-4cff-af17-b68a62e95113.png)
+
+After placement, the text can be updated or deleted by clicking on it again.
+
+![Delete Annotation](https://user-images.githubusercontent.com/85772166/233728428-55d2a8e5-a68a-4cd1-9dbf-4c1cd697187e.png)
+
+## Change Titles
+
+The title of the chart is edited by clicking the button, `Change Titles`, near the middle center of the toolbar, immediately to the right of the `Add Text` button.
+
+## Draw Tools
+
+![Edit Colors](https://user-images.githubusercontent.com/85772166/233729318-8af947fa-ce2a-43e2-85ab-657e583ac8b1.png)
+
+The fourth group of icons on the toolbar are for drawing lines and shapes.
+
+- Edit the colors.
+- Draw a straight line.
+- Draw a freeform line.
+- Draw a circle.
+- Draw a rectangle.
+- Erase a shape.
+
+To draw on the chart, select one of the four drawing buttons and drag the mouse over the desired area. Click on any existing shape to modify it by dragging with the mouse and editing the color, or remove it by clicking the toolbar button, `Erase Active Shape`. The edit colors button will pop up as a floating icon, and clicking on that will display the color palette.
+
+## Export Tools
+
+The two buttons at the far-right of the toolbar are for saving the raw data or, to save an image file of the chart at the current panned and zoomed view.
+
+![Export Tools](https://user-images.githubusercontent.com/85772166/233248436-08a2a463-403b-4b1b-b7d8-80cd5af7bee3.png)
+
+## Overlay
+
+The button, `Overlay chart from CSV`, provides an easy import method for supplementing a chart with additional data. Clicking on the button opens a pop-up dialogue to select the file, column, and whether the overlay should be a bar, candlestick, or line chart. As a candlestick, the CSV file must contain OHLC data. The import window can also be opened with the keyboard, `ctrl-o`.
+
+![Overlay CSV](https://user-images.githubusercontent.com/85772166/233248522-16b539f4-b0ae-4c30-8c72-dfa59d0c0cfb.png)
+
+After choosing the file to overlay, select what to show and then click on `Submit`.
+
+![Overlay Options](https://user-images.githubusercontent.com/85772166/233250634-44864da0-0936-4d3c-8de2-c8374d26c1d2.png)
+
+![Overlay Chart](https://user-images.githubusercontent.com/85772166/233248639-6d12b16d-471f-4550-a8ab-8d8c18eeabb3.png)
diff --git a/website/content/cli/interactive-tables.md b/website/content/cli/interactive-tables.md
new file mode 100644
index 000000000000..1399576b3606
--- /dev/null
+++ b/website/content/cli/interactive-tables.md
@@ -0,0 +1,75 @@
+---
+title: Interactive Tables
+sidebar_position: 10
+description: This page explains how to navigate and utilize OpenBB's interactive tables. Understand how to sort and filter columns, hide or remove columns, select number of rows per page, freeze index and column headers, and export the data.
+keywords:
+- interactive tables
+- PyWry technology
+- sorting columns
+- filtering columns
+- hiding columns
+- rows per page
+- freeze index
+- freeze column headers
+- exporting data
+- data visualization
+- customizing tables
+---
+
+import HeadTitle from '@site/src/components/General/HeadTitle.tsx';
+
+
+
+
+Interactive tables open in a separate window ([PyWry](https://github.com/OpenBB-finance/pywry)). These provide methods for searching, sorting, filtering, exporting and even adapting settings directly on the table.
+
+:::tip
+All OpenBB CLI results are displayed in interactive tables by default, unless the interactive model is disabled from the `/settings` menu.
+:::
+
+
+Table cheat sheet
+
+![Chart Intro (5)](https://user-images.githubusercontent.com/85772166/234315026-de098953-111b-4b69-9124-31530c01407a.png)
+
+
+
+## Sorting
+
+Columns can be sorted ascending/descending/unsorted, by clicking the controls to the right of each header title. The status of the filtering is shown as a blue indicator.
+
+![Sort Columns](https://user-images.githubusercontent.com/85772166/233248754-20c18390-a7af-490c-9571-876447b1b0ae.png)
+
+## Filtering
+
+The settings button, at the lower-left corner, displays choices for customizing the table. By selecting the `Type` to be `Advanced`, columns become filterable.
+
+![Table Settings](https://user-images.githubusercontent.com/85772166/233248876-0d788ff4-974d-4d92-8186-56864469870a.png)
+
+The columns can be filtered with min/max values or by letters, depending on the content of each column.
+
+![Filtered Tables](https://user-images.githubusercontent.com/85772166/233248923-45873bf1-de6b-40f8-a4aa-05e7c3d21ab0.png)
+
+## Hiding columns
+
+The table will scroll to the right as far as there are columns. Columns can be removed from the table by clicking the icon to the right of the settings button and unchecking it from the list.
+
+![Select Columns](https://user-images.githubusercontent.com/85772166/233248976-849791a6-c126-437c-bb54-454ba6ea4fa2.png)
+
+## Select rows per page
+
+The number of rows per page is defined in the drop down selection near the center, at the bottom.
+
+![Rows per Page](https://user-images.githubusercontent.com/85772166/233249018-8269896d-72f7-4e72-a4d4-2715d1f11b96.png)
+
+## Freeze the Index and Column Headers
+
+Right-click on the index name to enable/disable freezing when scrolling to the right. Column headers are frozen by default.
+
+![Index Freeze](https://user-images.githubusercontent.com/85772166/234103702-0965dfbd-24ca-4a66-8c76-9fac28abcff8.png)
+
+## Exporting Data
+
+At the bottom-right corner of the table window, there is a button for exporting the data. To the left, the drop down selection for `Type` can be defined as a CSV, XLSX, or PNG file. Exporting the table as a PNG file will create a screenshot of the table at its current view, and data that is not visible will not be captured.
+
+![Export Data](https://user-images.githubusercontent.com/85772166/233249065-60728dd1-612e-4684-b196-892f3604c0f4.png)
diff --git a/website/content/cli/openbbuserdata.md b/website/content/cli/openbbuserdata.md
new file mode 100644
index 000000000000..036731b19365
--- /dev/null
+++ b/website/content/cli/openbbuserdata.md
@@ -0,0 +1,59 @@
+---
+title: OpenBBUserData Folder
+sidebar_position: 8
+description: The OpenBBUserData folder is where exports, routines, and other user-related content is saved and stored. Its default location is the home of the system user account.
+keywords:
+- OpenBBUserData folder
+- settings
+- data
+- preferences
+- exports
+- CLI
+- save
+- routines
+- xlsx
+- csv
+- user_settings.json
+---
+
+import HeadTitle from '@site/src/components/General/HeadTitle.tsx';
+
+
+
+The OpenBBUserData folder is where exports, routines, and other user-related content is saved and stored.
+
+:::info
+If a new file is placed in the folder (like a Routine) the CLI will need to be reset before auto complete will recognize it.
+:::
+
+## Default Location
+
+Its default location is the home of the system user account, similar to the following paths:
+- macOS: `Macintosh HD/Users//OpenBBUserData`
+- Windows: `C:/Users//OpenBBUserData`
+
+This folder contains all things user-created. For example:
+
+- Exported files
+- Styles and themes
+- Routines
+- Logs
+
+:::note
+**Note:** With a WSL-enabled Windows installation, this folder will be under the Linux partition
+:::
+
+## Update Folder Location
+
+The location of this folder can be set by the user by changing the user configuration file: `/home/your-user/.openbb_platform/user_settings.json`.
+
+```json
+{
+...
+"preferences": {
+ "data_directory": "/path/to/NewOpenBBUserData",
+ "export_directory": "/path/to/NewOpenBBUserData"
+},
+...
+}
+```
diff --git a/website/content/cli/quickstart.md b/website/content/cli/quickstart.md
new file mode 100644
index 000000000000..ef9841087311
--- /dev/null
+++ b/website/content/cli/quickstart.md
@@ -0,0 +1,243 @@
+---
+title: Quick Start
+sidebar_position: 2
+description: This page is a quick start guide for the OpenBB CLI.
+keywords:
+- quickstart
+- quick start
+- tutorial
+- getting started
+- cli
+---
+
+import HeadTitle from '@site/src/components/General/HeadTitle.tsx';
+
+
+
+## Launch
+
+- Open a Terminal and activate the environment where the `openbb-cli` package was installed.
+- On the command line, enter: `openbb`
+
+![CLI Home](https://github.com/OpenBB-finance/OpenBBTerminal/assets/85772166/d1617c3b-c83d-4491-a7bc-986321fd7230)
+
+## Login
+
+Login to your [OpenBB Hub account](https://my.openbb.co) to add stored keys to the session.
+
+```console
+/account/login --pat REPLACE_WITH_YOUR_PAT
+```
+
+:::tip
+Add `--remember-me` to the command to persist the login until actively logging out.
+:::
+
+Login by email & password is also possible.
+
+```console
+/account/login --email my@emailaddress.com --password n0Ts3CuR3L!kEPAT
+```
+
+Find all data providers [here](https://docs.openbb.co/platform/extensions/data_extensions), and manage all your credentials directly on the [OpenBB Hub](https://my.openbb.co/app/platform/credentials).
+
+## Menus
+
+:::info
+Menus are distinguishable from commands by the character, `>`, on the left of the screen.
+:::
+
+Enter a menu by typing it out and pressing return.
+
+```console
+economy
+```
+
+![Economy Menu](https://github.com/OpenBB-finance/OpenBBTerminal/assets/85772166/b68491fc-d6c3-42a7-80db-bfe2aa848a5a)
+
+### Go Back One Level
+
+Return to the parent menu by entering either:
+
+- `..`
+- `q`
+
+### Go Back To Home
+
+Return to the base menu by entering either:
+
+- `/`
+- `home`
+
+### Jump Between Menus
+
+Use absolute paths to navigate from anywhere, to anywhere.
+
+From:
+
+```console
+/equity/calendar/earnings
+```
+
+To:
+
+```console
+/economy/calendar
+```
+
+## Commands
+
+Commands are displayed on-screen in a lighter colour, compared with menu items, and they will not have, `>`.
+
+Functions have a variety of parameters that differ by endpoint and provider. Use the `--help` dialogue to understand the nuances of any particular command.
+
+### How To Enter Parameters
+
+Parameters are all defined through the same pattern, `--argument`, followed by a space, and then the value.
+
+If the parameter is a boolean (true/false), there is no value to enter. Adding the `--argument` flags the parameter to be the opposite of its default state.
+
+:::danger
+The use of positional arguments is not supported.
+
+❌ `historical AAPL --start_date 2024-01-01`
+
+✅ `historical --symbol AAPL --start_date 2024-01-01`
+:::
+
+### Use Auto Complete
+
+The auto completion engine is triggered when the spacebar is pressed following any command, or parameter with a defined set of choices.
+
+After the first parameter has been set, remaining parameters will be triggered by entering `--`.
+
+```console
+historical --symbol AAPL --start_date 2024-01-01 --
+```
+
+![Auto Complete](https://github.com/OpenBB-finance/OpenBBTerminal/assets/85772166/78e68bbd-094e-4558-bce0-92b8d556fcaf)
+
+### Data Processing Commands
+
+Data processing extensions, like `openbb-technical` accept `--data` as an input.
+
+:::info
+Command outputs are cached. These can be check using the `results` command and are selected with the `--data` parameter.
+:::
+
+```console
+# Store the command output
+/equity/price/historical --symbol SPY --start_date 2024-01-01 --provider yfinance
+
+# Check results content
+results
+
+# Use the results
+/technical/rsi --data OBB0 --chart
+```
+
+![SPY RSI](https://github.com/OpenBB-finance/OpenBBTerminal/assets/85772166/b480da04-92e6-48e2-bccf-cebc16fb083a)
+
+## Help Dialogues
+
+Display the help dialogue by attaching, `--help` or `-h`, to any command.
+
+:::info
+Use this to identify the providers compatible with each parameter, if applicable.
+:::
+
+```console
+calendar --help
+```
+
+```console
+usage: calendar [--start_date START_DATE] [--end_date END_DATE] [--provider {fmp,nasdaq,tradingeconomics}] [--country COUNTRY] [--importance {Low,Medium,High}]
+ [--group {interest rate,inflation,bonds,consumer,gdp,government,housing,labour,markets,money,prices,trade,business}] [-h] [--export EXPORT]
+ [--sheet-name SHEET_NAME [SHEET_NAME ...]]
+
+Get the upcoming, or historical, economic calendar of global events.
+
+options:
+ --start_date START_DATE
+ Start date of the data, in YYYY-MM-DD format.
+ --end_date END_DATE End date of the data, in YYYY-MM-DD format.
+ --provider {fmp,nasdaq,tradingeconomics}
+ The provider to use for the query, by default None.
+ If None, the provider specified in defaults is selected or 'fmp' if there is
+ no default.
+ --country COUNTRY Country of the event. (provider: nasdaq, tradingeconomics)
+ -h, --help show this help message
+ --export EXPORT Export raw data into csv, json, xlsx and figure into png, jpg, pdf, svg
+ --sheet-name SHEET_NAME [SHEET_NAME ...]
+ Name of excel sheet to save data to. Only valid for .xlsx files.
+
+tradingeconomics:
+ --importance {Low,Medium,High}
+ Importance of the event.
+ --group {interest rate,inflation,bonds,consumer,gdp,government,housing,labour,markets,money,prices,trade,business}
+ Grouping of events
+
+```
+
+If the source selected was Nasdaq, `--provider nasdaq`, the `--importance` and `--group` parameters will be ignored.
+
+```console
+/economy/calendar --provider nasdaq --country united_states
+```
+
+| date | country | event | actual | previous | consensus | description |
+|:--------------------|:--------------|:-------------------------|:---------|:-----------|:------------|:--------------|
+| 2024-05-08 13:30:00 | United States | Fed Governor Cook Speaks | - | - | - | |
+| cont... | | | | | | |
+
+## Export Data
+
+Data can be exported as a CSV, JSON, or XLSX file, and can also be exported directly from the interactive tables and charts.
+
+### Named File
+
+This command exports the Nasdaq directory as a specific CSV file. The path to the file is displayed on-screen.
+
+```console
+/equity/search --provider nasdaq --export nasdaq_directory.csv
+```
+
+```console
+Saved file: /Users/myusername/OpenBBUserData/nasdaq_directory.csv
+```
+
+### Unnamed File
+
+If only supplied with the file type, the export will be given a generic name beginning with the date and time.
+
+```console
+/equity/search --provider nasdaq --export csv
+```
+
+```
+Saved file: /Users/myusername/OpenBBUserData/20240508_145308_controllers_search.csv
+```
+
+### Specify Sheet Name
+
+Exports can share the same `.xlsx` file by providing a `--sheet-name`.
+
+```console
+/equity/search --provider nasdaq --export directory.xlsx --sheet-name nasdaq
+```
+
+## Run Multiple Commands
+
+A chain of commands can be run from a single line, separate each process with `/`. The example below will draw two charts and can be pasted as a single line.
+
+```console
+/equity/price/historical --symbol AAPL,MSFT,GOOGL,AMZN,META,NVDA,NFLX,TSLA,QQQ --start_date 2022-01-01 --provider yfinance --chart/performance --symbol AAPL,MSFT,GOOGL,AMZN,META,NVDA,NFLX,TSLA,QQQ --provider finviz --chart
+```
+
+## Example Routine
+
+To demonstrate how multiple commands are sequenced as a script, try running the example Routine.
+
+```console
+/exe --example
+```
diff --git a/website/content/cli/routines/_category_.json b/website/content/cli/routines/_category_.json
new file mode 100644
index 000000000000..baa94ff89038
--- /dev/null
+++ b/website/content/cli/routines/_category_.json
@@ -0,0 +1,4 @@
+{
+ "label": "Routines",
+ "position": 11
+}
diff --git a/website/content/cli/routines/advanced-routines.md b/website/content/cli/routines/advanced-routines.md
new file mode 100644
index 000000000000..deb5988eb0ef
--- /dev/null
+++ b/website/content/cli/routines/advanced-routines.md
@@ -0,0 +1,119 @@
+---
+title: Advanced Routines
+sidebar_position: 5
+description: This page provides guidance on creating and running advanced workflows in the OpenBB CLI by
+ introducing variables and arguments for routines. It explains input variables,
+ relative time keyword variables, internal script variables and creating loops for
+ batch execution.
+keywords:
+- automated workflows
+- routines
+- arguments
+- variables
+- relative time keywords
+- internal script variables
+- loops
+- batch execution
+- Tutorial
+- Running Scripts
+- Executing Commands
+---
+
+import HeadTitle from '@site/src/components/General/HeadTitle.tsx';
+
+
+
+## Input Variables
+
+Arguments are variables referenced within the `.openbb` script as `$ARGV` or `$ARGV[0]`, `$ARGV[1]`, and so on. They are provided in the CLI when running `exe` by adding the `--input` flag, followed by the variables separated by commas.
+
+### Example
+
+```text
+# This script requires you to use arguments. This can be done with the following:
+# exe --file routines_template_with_input.openbb -i TSLA
+# Replace the name of the file with your file.
+
+# Navigate to the menu
+/equity/price
+
+# Load the data and display a chart
+historical --symbol $ARGV --chart
+```
+
+## Set Variables
+
+In addition to external variables using the keyword, `ARGV`, internal variables can be defined with the, `$`, character.
+
+Note that the variable can have a single element or can be constituted by an array where elements are separated using a comma “,”.
+
+### Internal Variables Example
+
+```text
+# Example routine with internal variables.
+
+$TICKERS = XLE,XOP,XLB,XLI,XLP,XLY,XHE,XLV,XLF,KRE,XLK,XLC,XLU,XLRE
+
+/equity
+
+price
+
+historical --symbol $TICKERS --provider yfinance --start_date 2024-01-01 --chart
+
+home
+```
+
+## Relative Time Keyword Variables
+
+In addition to the powerful variables discussed earlier, OpenBB also supports the usage of relative keywords, particularly for working with dates. These relative keywords provide flexibility when specifying dates about the current day. There are four types of relative keywords:
+
+1. **AGO**: Denotes a time in the past relative to the present day. Valid examples include `$365DAYSAGO`, `$12MONTHSAGO`, `$1YEARSAGO`.
+
+2. **FROMNOW**: Denotes a time in the future relative to the present day. Valid examples include `$365DAYSFROMNOW`, `$12MONTHSFROMNOW`, `$1YEARSFROMNOW`.
+
+3. **LAST**: Refers to the last specific day of the week or month that has occurred. Valid examples include `$LASTMONDAY`, `$LASTJUNE`.
+
+4. **NEXT**: Refers to the next specific day of the week or month that will occur. Valid examples include `$NEXTFRIDAY`, `$NEXTNOVEMBER`.
+
+The result will be a date with the conventional date associated with OpenBB, i.e. `YYYY-MM-DD`.
+
+### Relative Time Example
+
+```text
+$TICKERS = XLE,XOP,XLB,XLI,XLP,XLY,XHE,XLV,XLF,KRE,XLK,XLC,XLU,XLRE
+
+/equity
+
+price
+
+historical --symbol $TICKERS --provider yfinance --start_date $3MONTHSAGO --chart
+
+..
+
+calendar
+
+earnings --start_date $NEXTMONDAY --end_date $NEXTFRIDAY --provider nasdaq
+
+home
+```
+
+## Foreach Loop
+
+Finally, what scripting language would this be if there were no loops? For this, we were inspired by MatLab. The loops in OpenBB utilize the foreach and end convention, allowing for iteration through a list of variables or arguments to execute a sequence of commands.
+
+To create a foreach loop, you need to follow these steps:
+
+1. Create the loop header using the syntax: `foreach $$VAR in X` where `X` represents either an argument or a list of variables. It's worth noting that you can choose alternative names for the `$$VAR` variable, as long as the `$$` convention is maintained.
+
+2. Insert the commands you wish to repeat on the subsequent lines.
+
+3. Conclude the loop with the keyword `end`.
+
+### Loop Example
+
+```text
+# Iterates through ARGV elements.
+foreach $$VAR in $ARGV[1:]
+ /equity/fundamental/filings --symbol $$VAR --provider sec
+end
+```
diff --git a/website/content/cli/routines/community-routines.md b/website/content/cli/routines/community-routines.md
new file mode 100644
index 000000000000..1fa10fcdd048
--- /dev/null
+++ b/website/content/cli/routines/community-routines.md
@@ -0,0 +1,52 @@
+---
+title: Community Routines
+sidebar_position: 3
+description: Page provides a detailed overview of OpenBB's Community
+ Routines. It explains how users can create, modify, share, vote, download, and search for investment
+ research scripts.
+keywords:
+- Community Routines
+- Investment Research
+- Investment Scripts
+- Upvotes
+- Share Scripts
+- Advanced Search
+- CLI
+- automation
+- Hub
+---
+
+import HeadTitle from '@site/src/components/General/HeadTitle.tsx';
+
+
+
+## Overview
+
+Community Routines are a feature of the [OpenBB Hub](https://my.openbb.co) that provides methods for creating, editing and sharing OpenBB CLI scripts in the cloud.
+
+Users can create routines that are private or public, with public routines able to run directly from a URL.
+
+## Create Routines
+
+- From the sidebar, click on "My Routines".
+- Scroll down and click the button, "Create New".
+- Enter a name for the routine.
+- Select the "public" check box to make it runnable via URL.
+- Add tags (optional).
+- Add a short description.
+- Enter your workflow into the Script box.
+- Click the "Create" button.
+
+## Run From URL
+
+To run a routine with a URL, it must be made public. Existing routines can be modified by clicking on the item under, "My Routines". Check the "Public" box to activate.
+
+The URL will follow the pattern, `https://my.openbb.co/u/{username}/routine/{routine-name}`, which can be executed from the CLI with:
+
+```console
+/exe --url {URL}
+```
+
+## Download
+
+Alternatively, click the "Download" button at the bottom of the routine editor to manually download the file to the machine. Place the file in the `OpenBBUserData/routines` folder and open the CLI. The script will be presented as a choice by auto-complete.
diff --git a/website/content/cli/routines/index.mdx b/website/content/cli/routines/index.mdx
new file mode 100644
index 000000000000..cf5947ef80a0
--- /dev/null
+++ b/website/content/cli/routines/index.mdx
@@ -0,0 +1,31 @@
+---
+title: Routines
+---
+
+import NewReferenceCard from "@site/src/components/General/NewReferenceCard";
+import HeadTitle from "@site/src/components/General/HeadTitle.tsx";
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/website/content/cli/routines/introduction-to-routines.md b/website/content/cli/routines/introduction-to-routines.md
new file mode 100644
index 000000000000..7eaf8ecd9734
--- /dev/null
+++ b/website/content/cli/routines/introduction-to-routines.md
@@ -0,0 +1,130 @@
+---
+title: Introduction to Routines
+sidebar_position: 1
+description: The page provides a detailed introduction to OpenBB Routines, which allow
+ users to automate processes and repetitive tasks in financial analysis and data
+ collection. It explains conventions, basic scripts, routine execution, and guides users on getting
+ started with an example.
+keywords:
+- OpenBB Routines
+- automated processes
+- repetitive tasks
+- data collection
+- basic script
+- routine execution
+- automation
+- routines
+- cli
+---
+
+import HeadTitle from '@site/src/components/General/HeadTitle.tsx';
+
+
+
+## Overview
+
+OpenBB Routines allows users to capture and write simple scripts for automating processes and repetitive tasks. In essence, these are text plain-text files that can be created or modified in any basic text editor with the only difference being the `.openbb` extension.
+
+Other software like STATA, SPSS, and R-Studio share similar functionality in the area of Econometrics and the OpenBB routine scripts venture into the area of financial analysis and data collection to speed up the process.
+
+Routines make it easy to automate a series of processes, and this includes mining and dumping large amounts of data to organized spreadsheets. Making use of `--export` and `--sheet-name`, data collection is more efficient and reliable, with results that are easily replicable.
+
+A pipeline of commands is difficult to share, so to encourage users to share ideas and processes, we created [Community Routines](community-routines.md) for the [OpenBB Hub](https://my.openbb.co/). Routines can be created, stored, and shared - executable in any OpenBB CLI installation, by URL.
+
+## Pipeline of Commands
+
+One of the main objectives of the OpenBB Platform CLI is to automate a user's investment research workflow - not just a single command, but the complete process. This is where the pipeline of commands comes in, running a sequence of commands.
+
+An example of a pipeline of commands is:
+
+```console
+/equity/price/historical --symbol AAPL/../../technical/ema --data OBB0 --length 50
+```
+
+Which will perform a exponential moving average (`ema`) on the historical price of Apple (`AAPL`).
+
+### Step-by-Step Explanation
+
+This will do the following:
+
+1. `equity` - Go into `equity` menu.
+
+2. `price` - Go into `price` sub-menu.
+
+3. `historical --symbol AAPL` - Load historical price data for Apple.
+
+4. `..` (X2) will walk back to the root menu.
+
+5. `technical` - Go into Technical Analysis (`technical`) menu.
+
+6. `ema --data OBB0 --length 50` - Run the exponential moving average indicator with windows of length 50 (`--length 50`) on the last cached result (`--data OBB0`)
+
+## Routine execution
+
+Run a routine file from the main menu, with the `exe` command. Try, `exe --example`, to get a sense of what this functionality does. Below, the `--help` dialogue is displayed.
+
+```console
+/exe -h
+```
+
+```console
+usage: exe [--file FILE [FILE ...]] [-i ROUTINE_ARGS] [-e] [--url URL] [-h]
+
+Execute automated routine script. For an example, please use `exe --example` and for documentation and to learn how create your own script type `about exe`.
+
+optional arguments:
+ --file FILE [FILE ...], -f FILE [FILE ...]
+ The path or .openbb file to run. (default: None)
+ -i ROUTINE_ARGS, --input ROUTINE_ARGS
+ Select multiple inputs to be replaced in the routine and separated by commas. E.g. GME,AMC,BTC-USD (default: None)
+ -e, --example Run an example script to understand how routines can be used. (default: False)
+ --url URL URL to run openbb script from. (default: None)
+ -h, --help show this help message (default: False)
+
+For more information and examples, use 'about exe' to access the related guide.
+```
+
+## Basic Script
+
+The most basic script style contains 2 main elements:
+
+- **Comments**: any text after a hashtag (`#`) is referred to as a comment. This is used to explain what is happening within the line below and is ignored when the file is executed.
+- **Commands**: any text *without* a hashtag is being run inside the CLI as if the user had prompted that line in the terminal. Note that this means that you are able to create a pipeline of commands in a single line, i.e. `equity/price/historical --symbol AAPL --provider fmp` is a valid line for the script.
+
+For instance, the text below corresponds to the example file that OpenBB provides.
+
+```console
+# Navigate into the price sub-menu of the equity module.
+equity/price
+
+# Load a company ticker, e.g. Apple
+historical --symbol AAPL --provider yfinance
+
+# Show a candle chart with a 20 day Moving Average
+/technical/ema --data OBB0 --length 20
+
+# Switch over to the Fundamental Analysis menu
+/equity/fundamental
+
+# Show balance sheet
+balance --symbol aapl --provider yfinance
+
+# Show cash flow statement
+cash --symbol aapl --provider yfinance
+
+# Show income statement
+income --symbol aapl --provider yfinance
+
+# Return to home
+home
+```
+
+## Getting started
+
+As a starting point, let's use the example above.
+
+1. Create a new text file with the name `routines_template.openbb` and copy and paste the routine above.
+
+2. Move the file inside the `routines` folder within the [OpenBBUserData](openbbuserdata) folder and, optionally, adjust the name to your liking.
+
+3. Open up the CLI, and type `exe --file routines_template`. If you changed the name of the file, then replace, `routines_template`, with that. As long as the file remains in the `~/OpenBBUserData/routines` folder, the CLI's auto-completer will provide it as a choice.
diff --git a/website/content/cli/routines/routine-macro-recorder.md b/website/content/cli/routines/routine-macro-recorder.md
new file mode 100644
index 000000000000..2221b7d8d342
--- /dev/null
+++ b/website/content/cli/routines/routine-macro-recorder.md
@@ -0,0 +1,46 @@
+---
+title: Routine Macro Recorder
+sidebar_position: 4
+description: Learn how to use the macro recorder in OpenBB to start saving commands
+ and automate common tasks with scripts. This page guides you through the process
+ of recording, saving, and accessing your recorded routines.
+keywords:
+- macro recorder
+- script routines
+- global commands
+- command recording
+- routine script
+- terminal main menu
+- exe --file
+- OpenBBUserData
+- routines folder
+- cli
+- record
+- stop
+---
+
+import HeadTitle from '@site/src/components/General/HeadTitle.tsx';
+
+
+
+OpenBB script routines can be captured with the macro recorder, controlled with global commands. Enter, `record`, to start saving commands, and then, `stop`, terminates the recording. This means that any command you run will be captured in the script; and on `stop`, it will be saved to the `~/OpenBBUserData/routines/` folder.
+
+For example:
+
+```console
+record -n sample
+
+/equity/price/historical --symbol SPY --provider cboe --interval 1m/home/derivatives/options/chains --symbol SPY --provider cboe/home/stop/r
+```
+
+The final command after `stop`, `r`, resets the CLI so that the routine is presented as a choice in the `exe` command.
+
+It can now be played back by entering:
+
+```console
+/exe --file sample.openbb
+```
+
+:::tip
+The routine can be edited to replace parameter values with input variables - e.g, `$ARGV[0]`, `$ARGV[1]`, etc.
+:::
diff --git a/website/content/cli/structure-and-navigation.md b/website/content/cli/structure-and-navigation.md
new file mode 100644
index 000000000000..bcb6f6d840e0
--- /dev/null
+++ b/website/content/cli/structure-and-navigation.md
@@ -0,0 +1,42 @@
+---
+title: Structure and Navigation
+sidebar_position: 3
+description: This page describes the layout and structure of the OpenBB CLI, as well as how to navigate it.
+keywords:
+- CLI application
+- OpenBB Platform CLI
+- structure
+- navigation
+- Command Line Interface
+- navigating
+- Home
+- commands
+- menus
+- OpenBB Hub Theme Style
+- Absolute paths
+---
+
+import HeadTitle from '@site/src/components/General/HeadTitle.tsx';
+
+
+
+## Structure
+
+The OpenBB Platform CLI is a Command Line Interface (CLI) application. Functions (commands) are called through the keyboard with results returned as charts, tables, or text. Charts and tables (if enabled) are displayed in a new window, and are fully interactive, while text prints directly to the Terminal screen.
+
+A menu is a collection of commands (and sub-menus). A menu can be distinguished from a command because the former has a `>` on the left. The color of a command and a menu also differ, but these can be changed in OpenBB Hub's theme style.
+
+## Navigation
+
+Navigating through the CLI menus is similar to traversing folders from any operating system's command line prompt. The `/home` screen is the main directory where everything begins, and the menus are paths branched from the main. Instead of `C:\Users\OpenBB\Documents`, you'll have something like `/equity/price`. Instead of `cd ..`, you can do `..` to return the menu right above. To go back to the root menu you can do `/`.
+
+### Absolute Paths
+
+Absolute paths are also valid to-and-from any point. From the `/equity/price` menu, you can go directly to `crypto` menu with: `/crypto`. Note the forward slash at the start to denote the "absolute" path.
+
+### Home
+
+Return to the Home screen from anywhere by entering any of the following:
+
+- `/`
+- `home`
diff --git a/website/content/platform/installation.md b/website/content/platform/installation.md
index 2db5639e2f68..9ef0a060ce44 100644
--- a/website/content/platform/installation.md
+++ b/website/content/platform/installation.md
@@ -123,15 +123,6 @@ From your python interpreter, import the OpenBB Platform:
from openbb import obb
```
-:::warning
-This import statement is required due to the statefulness of the obb package. There is currently no support for imports such as
-
-```console
-from openbb.obb.equity import *
-```
-
-:::
-
When the package is imported, any installed extensions will be discovered, imported and available for use.
:::note
diff --git a/website/package-lock.json b/website/package-lock.json
index ddcb2300e626..d4355a0b3d57 100644
--- a/website/package-lock.json
+++ b/website/package-lock.json
@@ -13952,12 +13952,6 @@
"url": "https://opencollective.com/webpack"
}
},
- "node_modules/search-insights": {
- "version": "2.13.0",
- "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.13.0.tgz",
- "integrity": "sha512-Orrsjf9trHHxFRuo9/rzm0KIWmgzE8RMlZMzuhZOJ01Rnz3D0YBAe+V6473t6/H6c7irs6Lt48brULAiRWb3Vw==",
- "peer": true
- },
"node_modules/section-matter": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz",
@@ -15149,6 +15143,7 @@
"version": "5.4.5",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz",
"integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==",
+ "dev": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
diff --git a/website/sidebars.js b/website/sidebars.js
index 17d5b5dccbc3..f2ebf8ea6ea5 100644
--- a/website/sidebars.js
+++ b/website/sidebars.js
@@ -36,6 +36,11 @@ export default {
label: "OpenBB Platform",
items: [{ type: "autogenerated", dirName: "platform" }],
},
+ {
+ type: "category",
+ label: "OpenBB CLI",
+ items: [{ type: "autogenerated", dirName: "cli" }],
+ },
{
type: "category",
label: "OpenBB Bot",
diff --git a/website/src/components/General/NewReferenceCard.tsx b/website/src/components/General/NewReferenceCard.tsx
index f40993a99090..d75bb780f193 100644
--- a/website/src/components/General/NewReferenceCard.tsx
+++ b/website/src/components/General/NewReferenceCard.tsx
@@ -40,13 +40,16 @@ export default function NewReferenceCard({
cleanedPath.startsWith("/platform"),
"hover:bg-[#16A34A] border-[#16A34A] dark:hover:bg-[#14532D] dark:border-[#14532D]":
cleanedPath.startsWith("/excel"),
+ "hover:bg-[#D3D3D3] border-[#D3D3D3] dark:hover:bg-[#5c5c5c] dark:border-[#5c5c5c]":
+ cleanedPath.startsWith("/cli"),
header_docs:
!cleanedPath.startsWith("/terminal") &&
!cleanedPath.startsWith("/pro") &&
!cleanedPath.startsWith("/excel") &&
!cleanedPath.startsWith("/sdk") &&
!cleanedPath.startsWith("/platform") &&
- !cleanedPath.startsWith("/bot"),
+ !cleanedPath.startsWith("/bot") &&
+ !cleanedPath.startsWith("/cli"),
},
)}
to={url}
diff --git a/website/src/theme/CodeBlock/Content/styles.module.css b/website/src/theme/CodeBlock/Content/styles.module.css
index c1b10cde049a..1cc776c2fbfa 100644
--- a/website/src/theme/CodeBlock/Content/styles.module.css
+++ b/website/src/theme/CodeBlock/Content/styles.module.css
@@ -35,6 +35,7 @@
float: left;
min-width: 100%;
padding: var(--ifm-pre-padding);
+ line-height: 18px;
}
.codeBlockLinesWithNumbering {
diff --git a/website/src/theme/DocSidebarItem/Category/index.js b/website/src/theme/DocSidebarItem/Category/index.js
index 4ddec60bf68c..a374570c15c4 100644
--- a/website/src/theme/DocSidebarItem/Category/index.js
+++ b/website/src/theme/DocSidebarItem/Category/index.js
@@ -85,6 +85,7 @@ export default function DocSidebarItemCategory({
"OpenBB Bot": "/bot",
"OpenBB Terminal Pro": "/pro",
"OpenBB Add-in for Excel": "/excel",
+ "OpenBB CLI": "/cli",
};
const newHref = labelToHrefMap[label] || href;
const {
diff --git a/website/src/theme/Navbar/Layout/index.js b/website/src/theme/Navbar/Layout/index.js
index 8a767c3f6200..65e2a425e6e4 100644
--- a/website/src/theme/Navbar/Layout/index.js
+++ b/website/src/theme/Navbar/Layout/index.js
@@ -80,6 +80,18 @@ export default function NavbarLayout({ children }) {
"#3a204f"
);
}
+ } else if (cleanedPath.startsWith("/cli")) {
+ if (document.documentElement.getAttribute("data-theme") === "dark") {
+ document.documentElement.style.setProperty(
+ "--ifm-color-primary",
+ "#d3d3d3"
+ );
+ } else {
+ document.documentElement.style.setProperty(
+ "--ifm-color-primary",
+ "#d3d3d3"
+ );
+ }
} else {
}
}, [pathname]);
From 05322de3b70aff8c7a2b4a93085b64d47d7bec3f Mon Sep 17 00:00:00 2001
From: Danglewood <85772166+deeleeramone@users.noreply.github.com>
Date: Tue, 14 May 2024 09:08:18 -0700
Subject: [PATCH 13/13] add linux stuff to pre-requisites (#6411)
---
website/content/cli/installation.md | 24 +++++++++++++++++++++++-
1 file changed, 23 insertions(+), 1 deletion(-)
diff --git a/website/content/cli/installation.md b/website/content/cli/installation.md
index 51c1819538ab..67056410d796 100644
--- a/website/content/cli/installation.md
+++ b/website/content/cli/installation.md
@@ -28,6 +28,29 @@ Please refer to the [OpenBB Platform install documentation](/platform/installati
If the OpenBB Platform is not already installed, the `openbb-cli` package will install the default components.
:::
+### Linux Requirements
+
+Linux users will need to take additional steps prior to installation.
+
+#### Rust
+
+Rust and Cargo must be installed, system-level, and in the PATH. Follow the instructions on-screen to install and add to PATH in the shell profile.
+
+```bash
+curl --proto '=https' --tlsv1.3 https://sh.rustup.rs -sSf | sh
+```
+
+#### Webkit
+
+Next, install webkit.
+
+- Debian-based / Ubuntu / Mint: `sudo apt install libwebkit2gtk-4.0-dev`
+
+- Arch Linux / Manjaro: `sudo pacman -S webkit2gtk`
+
+- Fedora: `sudo dnf install gtk3-devel webkit2gtk3-devel`
+
+
## PyPI
Within your existing OpenBB environment, install `openbb-cli` with:
@@ -36,7 +59,6 @@ Within your existing OpenBB environment, install `openbb-cli` with:
pip install openbb-cli
```
-
The installation script adds `openbb` to the PATH within your Python environment. The application can be launched from any path, as long as the environment is active.
```console