Files
OpenBB/platform/development/developer-guidelines/add_data_point.html
github-actions[bot] 0a9ede4d4d deploy: 00febe1942
2024-01-08 12:14:38 +00:00

21 lines
74 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!doctype html>
<html lang="en" dir="ltr" class="docs-wrapper docs-doc-page docs-version-current plugin-docs plugin-id-default docs-doc-id-platform/development/developer-guidelines/add_data_point" data-has-hydrated="false">
<head>
<meta charset="UTF-8">
<meta name="generator" content="Docusaurus v2.4.3">
<title data-rh="true">Integrating Data Sources and Points - Developer Guidelines - Development | OpenBB Platform Docs</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://docs.openbb.co/img/banner.png"><meta data-rh="true" name="twitter:image" content="https://docs.openbb.co/img/banner.png"><meta data-rh="true" property="og:url" content="https://docs.openbb.co/platform/development/developer-guidelines/add_data_point"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Integrating Data Sources and Points | OpenBB Docs"><meta data-rh="true" name="description" content="This comprehensive guide is designed to assist developers in integrating custom data sources and adding new data points to the OpenBB Platform. It covers the creation of custom extensions, standardization of data, definition of models, and the construction of a Fetcher class. This document is essential for developers looking to enhance the platform with new data capabilities."><meta data-rh="true" property="og:description" content="This comprehensive guide is designed to assist developers in integrating custom data sources and adding new data points to the OpenBB Platform. It covers the creation of custom extensions, standardization of data, definition of models, and the construction of a Fetcher class. This document is essential for developers looking to enhance the platform with new data capabilities."><meta data-rh="true" name="keywords" content="OpenBB Platform,Data point addition,Provider creation,Query parameters,Data output models,Fetcher class,OpenBB custom data sources,Data standardization,Pydantic models,OpenBB extensions"><link data-rh="true" rel="icon" href="/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://docs.openbb.co/platform/development/developer-guidelines/add_data_point"><link data-rh="true" rel="alternate" href="https://docs.openbb.co/platform/development/developer-guidelines/add_data_point" hreflang="en"><link data-rh="true" rel="alternate" href="https://docs.openbb.co/platform/development/developer-guidelines/add_data_point" hreflang="x-default"><link data-rh="true" rel="preconnect" href="https://7D1HQ0IXAS-dsn.algolia.net" crossorigin="anonymous"><link rel="search" type="application/opensearchdescription+xml" title="OpenBB Docs" href="/opensearch.xml">
<link rel="stylesheet" href="/katex/katex.min.css"><link rel="stylesheet" href="/assets/css/styles.35f072c4.css">
<link rel="preload" href="/assets/js/runtime~main.7ef08293.js" as="script">
<link rel="preload" href="/assets/js/main.875c0435.js" as="script">
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"dark")}()</script><div id="__docusaurus">
<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav class="border-b border-grey-600 lg:px-12 header_docs_sdk navbar navbar--fixed-top"><div class="navbar__inner items-center"><div class="navbar__items"><div class="items-center ml-2 flex"><a href="/"><svg viewBox="0 0 271 19" width="271" height="19" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill="#fff" d="M126.316.99V14.33l-1.144-1.11-1.142-1.113-1.144-1.11-1.142-1.114-1.144-1.11-1.145-1.113-1.141-1.11-1.145-1.114-1.142-1.113-1.144-1.11-1.142-1.11-1.144-1.114H110.311v17.788H112.597V4.323l1.144 1.113 1.142 1.113 1.144 1.11 1.142 1.114 1.145 1.11 1.141 1.113 1.145 1.11 1.144 1.114 1.142 1.11 1.144 1.113 1.142 1.113 1.144 1.11 1.142 1.111h1.145V.989h-2.287ZM163.123 7.66h-2.286V.99H147.12v17.79h18.294V7.65h-2.286l-.005.01ZM149.406 6.54V3.213h9.144V7.66h-9.144V6.54Zm13.717 4.447v5.566h-13.717V9.886h13.717v1.102ZM201.057 7.66h-3.427V.99h-13.72v17.79h18.289V7.65l-1.142.01ZM186.196 6.54V3.213h9.148V7.66h-9.148V6.54Zm13.72 4.447v5.566h-13.72V9.886h13.72v1.102ZM89.662.99H73.656v17.787H91.942v-2.22H75.945V12.106H89.656V9.883H75.945V3.213H91.942V.99H89.661ZM16.02.99H.018v17.79h18.291V.99H16.02Zm0 3.336v12.23H2.301V3.213h13.72v1.113ZM52.862.99H36.86v17.79h2.286v-6.673h16.003V.977h-2.287V.99Zm0 3.336v5.565H39.146V3.213h13.716v1.113ZM226.316 10.14h-6.117v8.64h6.141l.992-1v-7l-1.016-.64Zm-.002 1.62v5.94h-5.1v-6.48h5.1v.54ZM240.447 10.14h-7.115v8.64h8.133v-8.64h-1.018Zm0 1.62v5.94h-6.1v-6.48h6.1v.54ZM254.9 10.14H247.465v8.64H255.959V17.7H248.528V11.22H255.959v-1.08H254.9ZM269.404 10.14h-7.444V15h7.448v2.701h-5.853l-1.596.005.001.535v.539h8.505V17.7h-1.061.004H263.555l6.913.066.002-.607-.002-.41-.003-.67.005-1.08h-6.248 6.248l-.002-1.08H263.024v-2.7h7.441v-1.08h-1.061Z"></path></svg></a></div></div><div class="navbar__items navbar__items--right hidden sm:block"><div class="flex items-center"><div class="flex gap-4 mr-12 md:mr-0 ml-4"><button type="button" aria-haspopup="dialog" aria-expanded="false" aria-controls="" data-state="closed" class="bg-grey-900 radix-state-open:text-white hover:border-grey-200 hover:text-grey-200 radix-state-open:border-white border -mt-[0.6px] h-[34px] w-[34px] text-grey-400 border-grey-400 rounded flex items-center justify-center"><svg viewBox="0 0 24 24" width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg" class="w-4 h-4"><path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79Z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path></svg></button></div><div class="searchBox_ZlJk"><div class="flex gap-2"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search"><span class="DocSearch-Button-Container"><svg width="20" height="20" class="DocSearch-Search-Icon" viewBox="0 0 20 20"><path d="M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z" stroke="currentColor" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"></path></svg><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"></span></button><a href="https://my.openbb.co/" class="_btn-dark text-xs hover:text-black"><span class="md:hidden">Hub</span><span class="hidden md:inline">OpenBB Hub</span></a></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="main-wrapper mainWrapper_z2l0 docsWrapper_BCFX"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docPage__5DB"><aside class="theme-doc-sidebar-container docSidebarContainer_b6E3"><div class="sidebarViewport_Xe31"><div class="sidebar_njMd"><nav class="menu thin-scrollbar !px-10 text-sm !pb-10 mt-[40px] menu_Y1UP"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" aria-expanded="true" href="/platform">OpenBB Platform</a><button aria-label="Toggle the collapsible sidebar category &#x27;OpenBB Platform&#x27;" type="button" class="clean-btn menu__caret"></button></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/platform">Introduction</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/platform/installation">Installation</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" aria-expanded="false" tabindex="0" href="/platform/extensions">Extensions</a><button aria-label="Toggle the collapsible sidebar category &#x27;Extensions&#x27;" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" aria-expanded="false" tabindex="0" href="/platform/usage">Usage</a><button aria-label="Toggle the collapsible sidebar category &#x27;Usage&#x27;" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" aria-expanded="false" tabindex="0" href="/platform/reference">Reference</a><button aria-label="Toggle the collapsible sidebar category &#x27;Reference&#x27;" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" aria-expanded="true" tabindex="0" href="/platform/development">Development</a><button aria-label="Toggle the collapsible sidebar category &#x27;Development&#x27;" type="button" class="clean-btn menu__caret"></button></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/platform/development/dependency_management">Dependency Management</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-3 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret menu__link--active" aria-expanded="true" tabindex="0" href="/platform/development/developer-guidelines/devtools">Developer Guidelines</a></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-4 menu__list-item"><a class="menu__link" tabindex="0" href="/platform/development/developer-guidelines/devtools">DevTools</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-4 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/platform/development/developer-guidelines/add_data_point">Integrating Data Sources and Points</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-4 menu__list-item"><a class="menu__link" tabindex="0" href="/platform/development/developer-guidelines/build_openbb_extensions">Building Extensions for OpenBB Platform</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-4 menu__list-item"><a class="menu__link" tabindex="0" href="/platform/development/developer-guidelines/validators">Validators</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-4 menu__list-item"><a class="menu__link" tabindex="0" href="/platform/development/developer-guidelines/architectural_considerations">Architectural Considerations</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-4 menu__list-item"><a class="menu__link" tabindex="0" href="/platform/development/developer-guidelines/obbject">OpenBB OBBject</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-4 menu__list-item"><a class="menu__link" tabindex="0" href="/platform/development/developer-guidelines/obbject_extensions">OBBject Extensions</a></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-3 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" aria-expanded="false" tabindex="0" href="/platform/development/contributor-guidelines">Contributor Guidelines</a><button aria-label="Toggle the collapsible sidebar category &#x27;Contributor Guidelines&#x27;" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" aria-expanded="false" tabindex="0" href="/platform/faqs">FAQs</a><button aria-label="Toggle the collapsible sidebar category &#x27;FAQs&#x27;" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" aria-expanded="false" tabindex="0" href="/platform/data_models">Data Models</a><button aria-label="Toggle the collapsible sidebar category &#x27;Data Models&#x27;" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" aria-expanded="false" href="/terminal">OpenBB Terminal</a><button aria-label="Toggle the collapsible sidebar category &#x27;OpenBB Terminal&#x27;" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" aria-expanded="false" href="/bot">OpenBB Bot</a><button aria-label="Toggle the collapsible sidebar category &#x27;OpenBB Bot&#x27;" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1"><span class="sidebar-divider"></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menuHtmlItem_PEWV menu__list-item sidebar-title">LEGACY</li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="/sdk">OpenBB SDK</a></div></li></ul></nav></div></div></aside><main class="docMainContainer_gTbr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs" itemscope="" itemtype="https://schema.org/BreadcrumbList"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><span class="breadcrumbs__link">OpenBB Platform</span><meta itemprop="position" content="1"></li><li itemscope="" itemprop="itemListElement" itemtype="https://schema.org/ListItem" class="breadcrumbs__item"><a class="breadcrumbs__link" itemprop="item" href="/platform/development"><span itemprop="name">Development</span></a><meta itemprop="position" content="2"></li><li class="breadcrumbs__item"><span class="breadcrumbs__link">Developer Guidelines</span><meta itemprop="position" content="3"></li><li itemscope="" itemprop="itemListElement" itemtype="https://schema.org/ListItem" class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link" itemprop="name">Integrating Data Sources and Points</span><meta itemprop="position" content="4"></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_bxCs"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Integrating Data Sources and Points</h1></header><p>In this section, we&#x27;ll be adding a new data point to the OpenBB Platform. We will add a new provider with an existing model, imported from: <a href="/platform/data_models">openbb_core.provider.standard_models</a>.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="identify-your-data">Identify your data<a href="#identify-your-data" class="hash-link" aria-label="Direct link to Identify your data" title="Direct link to Identify your data">​</a></h2><p>You will get your data either from a CSV file, local database or from an API endpoint.</p><div class="theme-admonition theme-admonition-note alert alert--secondary admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_S0QG"><p>If you don&#x27;t want or don&#x27;t need to partake in the data standardization framework, you have the option to add all the logic straight inside the router file. This is usually the case when you are returning custom data from your local CSV file, or similar. Keep in mind that we also serve the REST API and that you shouldn&#x27;t send non-serializable objects as a response (e.g. a pandas dataframe).</p></div></div><p>We highly recommend following the standardization framework, as it will make your life easier in the long run and unlock a set of features that are only available to standardized data.</p><p>When standardizing, all data is defined using two different pydantic models:</p><ol><li>Define the <a href="https://github.com/OpenBB-finance/OpenBBTerminal/blob/develop/openbb_platform/provider/openbb_core/provider/abstract/query_params.py" target="_blank" rel="noopener noreferrer">query parameters</a> model.</li><li>Define the resulting <a href="https://github.com/OpenBB-finance/OpenBBTerminal/blob/develop/openbb_platform/provider/openbb_core/provider/abstract/data.py" target="_blank" rel="noopener noreferrer">data schema</a> model.</li></ol><blockquote><p>The models can be entirely custom, or inherit from the OpenBB standardized models.
They enforce a safe and consistent data structure, validation and type checking.</p></blockquote><p>We call this the <strong><em>Know-Your-Data</em></strong> principle.</p><p>In the following example, we&#x27;ll be adding historical, end-of-day OHLC (open, high, low, close) equity data that is used by the <code>obb.equity.price.historical</code> command.</p><p>Note that if no command exists for your data, we need to add one under the right router.</p><p>Each router is categorized under the relevant extension (equity, currency, crypto, etc.).</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="check-if-the-standard-model-exists">Check if the standard model exists<a href="#check-if-the-standard-model-exists" class="hash-link" aria-label="Direct link to Check if the standard model exists" title="Direct link to Check if the standard model exists">​</a></h2><p>Given the fact that there&#x27;s already an endpoint for historical equity data, we can check for the existing standard model.</p><p>In this case, it&#x27;s <code>EquityHistorical</code> which can be found in the list of data models <a href="/platform/data_models">here</a>.</p><p>If the standard model doesn&#x27;t exist:</p><ul><li>you won&#x27;t need to inherit from it in the next steps.</li><li>all your provider query parameters will be under the <code>**kwargs</code> in the python interface.</li><li>it might not work out-of-the box with other extensions that follow standardization e.g. the <code>charting</code> extension</li></ul><h3 class="anchor anchorWithStickyNavbar_LWe7" id="create-query-parameters-model">Create Query Parameters model<a href="#create-query-parameters-model" class="hash-link" aria-label="Direct link to Create Query Parameters model" title="Direct link to Create Query Parameters model">​</a></h3><p>Query Parameters are the parameters that are passed to the API endpoint in order to make the request.</p><p>For the <code>EquityHistorical</code> example, this would look like the following:</p><div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_m3Ux"><pre tabindex="0" class="prism-code language-python codeBlock_qGQc thin-scrollbar"><code class="codeBlockLines_p187"><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">class</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token plain">ProviderName</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain">EquityHistoricalQueryParams</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">EquityHistoricalQueryParams</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"> </span><span class="token triple-quoted-string string" style="color:rgb(206, 145, 120)">&quot;&quot;&quot;&lt;ProviderName&gt; Equity Historical Query.</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token triple-quoted-string string" style="display:inline-block;color:rgb(206, 145, 120)"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token triple-quoted-string string" style="color:rgb(206, 145, 120)"> Source: https://www.&lt;provider_name&gt;.co/documentation/</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token triple-quoted-string string" style="color:rgb(206, 145, 120)"> &quot;&quot;&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"> </span><span class="token comment" style="color:rgb(106, 153, 85)"># provider specific query parameters if any</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup_6DOT"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h3 class="anchor anchorWithStickyNavbar_LWe7" id="create-data-output-model">Create Data Output model<a href="#create-data-output-model" class="hash-link" aria-label="Direct link to Create Data Output model" title="Direct link to Create Data Output model">​</a></h3><p>The data output model is a data class containing Fields mapping the response of the API.</p><p>For the <code>StockHistorical</code> example, this would look like the following:</p><div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_m3Ux"><pre tabindex="0" class="prism-code language-python codeBlock_qGQc thin-scrollbar"><code class="codeBlockLines_p187"><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">class</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token plain">ProviderName</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain">EquityHistoricalData</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">EquityHistoricalData</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"> </span><span class="token triple-quoted-string string" style="color:rgb(206, 145, 120)">&quot;&quot;&quot;&lt;ProviderName&gt; Equity Historical Data.</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token triple-quoted-string string" style="display:inline-block;color:rgb(206, 145, 120)"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token triple-quoted-string string" style="color:rgb(206, 145, 120)"> Source: https://www.&lt;provider_name&gt;.co/documentation/</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token triple-quoted-string string" style="color:rgb(206, 145, 120)"> &quot;&quot;&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"> </span><span class="token comment" style="color:rgb(106, 153, 85)"># provider specific data output fields if any</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup_6DOT"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><blockquote><p>Note that, since <code>EquityHistoricalData</code> inherits from pydantic&#x27;s <code>BaseModel</code>, we can leverage validators to perform additional checks on the output model. A very good example of this, would be to transform a string date into a datetime object.</p></blockquote><h3 class="anchor anchorWithStickyNavbar_LWe7" id="optional-vs-required-fields-when-creating-models">Optional vs Required fields when creating models<a href="#optional-vs-required-fields-when-creating-models" class="hash-link" aria-label="Direct link to Optional vs Required fields when creating models" title="Direct link to Optional vs Required fields when creating models">​</a></h3><p>When creating a new model, you need to decide whether a field is required or not.</p><p>This is done by using <code>typing</code>&#x27;s <code>Optional</code> when defining the field type.</p><p>In the context of the <strong>Standard Models</strong>:</p><ul><li>Required: all the providers use that field (either to query or to present data).</li><li>Optional: at least two providers use that field (either to query or to present data).</li></ul><p>In the context of the <strong>Provider Models</strong>:</p><ul><li>Required: the provider uses that field:<ul><li>Needs the field to query the API.</li><li>The data presented by the provider contains that field.</li></ul></li><li>Optional: the may or may not use that field:<ul><li>If the user uses that field, the provider will also use it to query the API.</li><li>The data presented by the provider may or may not contain that field.</li></ul></li></ul><blockquote><p>Learn more about Pydantic&#x27;s fields <a href="https://docs.pydantic.dev/latest/concepts/fields/" target="_blank" rel="noopener noreferrer">here</a>.</p></blockquote><h3 class="anchor anchorWithStickyNavbar_LWe7" id="build-the-fetcher">Build the Fetcher<a href="#build-the-fetcher" class="hash-link" aria-label="Direct link to Build the Fetcher" title="Direct link to Build the Fetcher">​</a></h3><p>The <code>Fetcher</code> class is responsible for processing the Query and turning that into an API request and finally returning the data model. Each fetcher contains three methods that are implemented by its abstract definition:</p><ul><li><code>transform_query</code><ul><li>Convert a standard query into a provider-specific query</li></ul></li><li><code>extract_data</code><ul><li>Get the data from the API endpoint</li></ul></li><li><code>transform_data</code><ul><li>Convert the API response data into a list of standard data models.</li></ul></li></ul><blockquote><p>Read more on the <code>TET</code> pattern <a href="/platform/development/developer-guidelines/architectural_considerations#the-tet-pattern">here</a>.</p></blockquote><div class="theme-admonition theme-admonition-note alert alert--secondary admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_S0QG"><p>Note that the <code>Fetcher</code> should inherit from the <a href="https://github.com/OpenBB-finance/OpenBBTerminal/blob/develop/openbb_platform/provider/openbb_core/provider/abstract/fetcher.py" target="_blank" rel="noopener noreferrer"><code>Fetcher</code></a> class, which is a generic class that receives the query parameters and the data model as type parameters.</p></div></div><p>For the <code>EquityHistorical</code> example, this would look like the following:</p><div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_m3Ux"><pre tabindex="0" class="prism-code language-python codeBlock_qGQc thin-scrollbar"><code class="codeBlockLines_p187"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">class</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token plain">ProviderName</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain">EquityHistoricalFetcher</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"> Fetcher</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token plain">ProviderName</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain">EquityHistoricalQueryParams</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"> List</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token plain">ProviderName</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain">EquityHistoricalData</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"> </span><span class="token triple-quoted-string string" style="color:rgb(206, 145, 120)">&quot;&quot;&quot;Transform the query, extract and transform the data.&quot;&quot;&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"> </span><span class="token decorator annotation punctuation" style="color:rgb(212, 212, 212)">@staticmethod</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">transform_query</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">params</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> Dict</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token builtin" style="color:rgb(86, 156, 214)">str</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> Any</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token plain">ProviderName</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain">EquityHistoricalQueryParams</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"> </span><span class="token triple-quoted-string string" style="color:rgb(206, 145, 120)">&quot;&quot;&quot;Transform the query parameters.&quot;&quot;&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">return</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token plain">ProviderName</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain">EquityHistoricalQueryParams</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token operator" style="color:rgb(212, 212, 212)">**</span><span class="token plain">transformed_params</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"> </span><span class="token decorator annotation punctuation" style="color:rgb(212, 212, 212)">@staticmethod</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">extract_data</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"> query</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token plain">ProviderName</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain">EquityHistoricalQueryParams</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"> credentials</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> Optional</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain">Dict</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token builtin" style="color:rgb(86, 156, 214)">str</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(86, 156, 214)">str</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">**</span><span class="token plain">kwargs</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> Any</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(86, 156, 214)">dict</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"> </span><span class="token triple-quoted-string string" style="color:rgb(206, 145, 120)">&quot;&quot;&quot;Return the raw data from the endpoint.&quot;&quot;&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"> obtained_data </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> my_request</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">query</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> credentials</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">**</span><span class="token plain">kwargs</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">return</span><span class="token plain"> obtained_data</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"> </span><span class="token decorator annotation punctuation" style="color:rgb(212, 212, 212)">@staticmethod</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">transform_data</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"> data</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(86, 156, 214)">dict</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"> List</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token plain">ProviderName</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain">EquityHistoricalData</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"> </span><span class="token triple-quoted-string string" style="color:rgb(206, 145, 120)">&quot;&quot;&quot;Transform the data to the standard format.&quot;&quot;&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">return</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token plain">ProviderName</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain">EquityHistoricalData</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">model_validate</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">d</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">for</span><span class="token plain"> d </span><span class="token keyword" style="color:rgb(86, 156, 214)">in</span><span class="token plain"> data</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><br></span></code></pre><div class="buttonGroup_6DOT"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="make-the-provider-visible">Make the provider visible<a href="#make-the-provider-visible" class="hash-link" aria-label="Direct link to Make the provider visible" title="Direct link to Make the provider visible">​</a></h2><p>After finalizing your models, you need to make them visible to the Openbb Platform.
This is done by adding the <code>Fetcher</code> to the <code>__init__.py</code> file of the <code>&lt;your_package_name&gt;/&lt;your_module_name&gt;</code> folder as part of the <a href="https://github.com/OpenBB-finance/OpenBBTerminal/blob/develop/openbb_platform/provider/openbb_core/provider/abstract/provider.py" target="_blank" rel="noopener noreferrer"><code>Provider</code></a>.</p><div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_m3Ux"><pre tabindex="0" class="prism-code language-python codeBlock_qGQc thin-scrollbar"><code class="codeBlockLines_p187"><span class="token-line" style="color:#9CDCFE"><span class="token triple-quoted-string string" style="color:rgb(206, 145, 120)">&quot;&quot;&quot;&lt;Provider Name&gt; Provider module.&quot;&quot;&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> openbb_core</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">provider</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">abstract</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">provider </span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> Provider</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> openbb_</span><span class="token operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token plain">provider_name</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">models</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">equity_historical </span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token plain">ProviderName</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain">EquityHistoricalFetcher</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token plain">provider_name</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain">_provider </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> Provider</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"> name</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string" style="color:rgb(206, 145, 120)">&quot;&lt;provider_name&gt;&quot;</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"> website</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string" style="color:rgb(206, 145, 120)">&quot;&lt;URL to the provider website&gt;&quot;</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"> description</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string" style="color:rgb(206, 145, 120)">&quot;Provider description goes here&quot;</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"> credentials</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token string" style="color:rgb(206, 145, 120)">&quot;api_key&quot;</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"> fetcher_dict</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">&quot;EquityHistorical&quot;</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token plain">ProviderName</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain">EquityHistoricalFetcher</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><br></span></code></pre><div class="buttonGroup_6DOT"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Any command, that uses the <code>Fetcher</code> class you&#x27;ve just defined, will be calling the <code>transform_query</code>, <code>extract_data</code> and <code>transform_data</code> methods under the hood in order to get the data and output it do the end user.</p><p>If the provider does not require any credentials, you can remove that parameter. On the other hand, if it requires more than 2 items to authenticate, you can add a list of all the required items to the <code>credentials</code> list.</p><div class="theme-admonition theme-admonition-info alert alert--info admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_S0QG"><p>After running <code>pip install .</code> on <code>openbb_platform/providers/&lt;provider_name&gt;</code> your provider should be ready for usage, both from the Python interface and the API.</p></div></div><p>If you&#x27;re not sure what&#x27;s a command and why is it even using the <code>Fetcher</code> class, follow along!</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="openbb-platform-commands">OpenBB Platform Commands<a href="#openbb-platform-commands" class="hash-link" aria-label="Direct link to OpenBB Platform Commands" title="Direct link to OpenBB Platform Commands">​</a></h2><p>The OpenBB Platform will enable you to query and output your data in a very simple way.</p><blockquote><p>Any Platform endpoint will be available both from a Python interface and the API.</p></blockquote><p>The command definition on the Platform follows <a href="https://fastapi.tiangolo.com/" target="_blank" rel="noopener noreferrer">FastAPI</a> conventions, meaning that you&#x27;ll be creating <strong>endpoints</strong>.</p><p>The <a href="https://github.com/OpenBB-finance/openbb-cookiecutter" target="_blank" rel="noopener noreferrer">Cookiecutter template</a> generates for you a <code>router.py</code> file with a set of examples that you can follow, namely:</p><ul><li>Perform a simple <code>GET</code> and <code>POST</code> request - without worrying on any custom data definition.</li><li>Using a custom data definition so you get your data the exact way you want it.</li></ul><p>You can expect the following endpoint structure when using a <code>Fetcher</code> to serve the data:</p><div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_m3Ux"><pre tabindex="0" class="prism-code language-python codeBlock_qGQc thin-scrollbar"><code class="codeBlockLines_p187"><span class="token-line" style="color:#9CDCFE"><span class="token decorator annotation punctuation" style="color:rgb(212, 212, 212)">@router</span><span class="token decorator annotation punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token decorator annotation punctuation" style="color:rgb(212, 212, 212)">command</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">model</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string" style="color:rgb(206, 145, 120)">&quot;Example&quot;</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">model_example</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"> cc</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> CommandContext</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"> provider_choices</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> ProviderChoices</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"> standard_params</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> StandardParams</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"> extra_params</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> ExtraParams</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"> OBBject</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain">BaseModel</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"> </span><span class="token triple-quoted-string string" style="color:rgb(206, 145, 120)">&quot;&quot;&quot;Example Data.&quot;&quot;&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">return</span><span class="token plain"> OBBject</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">results</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain">Query</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token operator" style="color:rgb(212, 212, 212)">**</span><span class="token builtin" style="color:rgb(86, 156, 214)">locals</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">execute</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><br></span></code></pre><div class="buttonGroup_6DOT"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Let&#x27;s break it down:</p><ul><li><code>@router.command(...)</code> - this tells the OpenBB Platform that this is a command.</li><li><code>model=&quot;Example&quot;</code> - this is the name of the <code>Fetcher</code> dictionary key that you&#x27;ve defined in the <code>__init__.py</code> file of the <code>&lt;your_package_name&gt;/&lt;your_module_name&gt;</code> folder.</li><li><code>cc: CommandContext</code> - this contains a set of user and system settings that is useful during the execution of the command - eg. api keys.</li><li><code>provider_choices: ProviderChoices</code> - all the providers that implement the <code>Example</code> <code>Fetcher</code>.</li><li><code>standard_params: StandardParams</code> - standardized parameters that are common to all providers that implement the <code>Example</code> <code>Fetcher</code>.</li><li><code>extra_params: ExtraParams</code> - it contains the provider specific arguments that are not standardized.</li></ul><p>You only need to change the <code>model</code> parameter to the name of the <code>Fetcher</code> dictionary key and everything else will be handled by the OpenBB Platform.</p></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="theme-doc-footer-edit-meta-row row"><div class="col"><a href="https://github.com/OpenBB-finance/OpenBBTerminal/edit/main/website/content/platform/development/developer-guidelines/add_data_point.md" target="_blank" rel="noreferrer noopener" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_Z9Sw" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>Edit this page</a></div><div class="col lastUpdated_vwxv"><span class="theme-last-updated">Last updated<!-- --> on <b><time datetime="2024-01-08T11:53:05.000Z">Jan 8, 2024</time></b> by <b>montezdesousa</b></span></div></div></footer></article><nav class="pagination-nav docusaurus-mt-lg" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/platform/development/developer-guidelines/devtools"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">DevTools</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/platform/development/developer-guidelines/build_openbb_extensions"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">Building Extensions for OpenBB Platform</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_jeP5 thin-scrollbar text-sm mt-[48px] xl:max-w-[216px] theme-doc-toc-desktop"><p class="uppercase text-sm font-bold text-grey-600 dark:text-grey-200 tracking-widest mb-2">On this page</p><ul class="border-l border-grey-300 dark:border-grey-600 list-none pl-4"><li class="pb-1"><a href="#identify-your-data" class="text-grey-400 capitalize !no-underline">Identify your data</a></li><li class="py-1"><a href="#check-if-the-standard-model-exists" class="text-grey-400 capitalize !no-underline">Check if the standard model exists</a><ul class="list-none ml-1 border-l border-grey-300 dark:border-grey-600 mt-2"><li class="pb-1 pl-3"><a href="#create-query-parameters-model" class="text-grey-400 capitalize !no-underline">Create Query Parameters model</a></li><li class="py-1 pl-3"><a href="#create-data-output-model" class="text-grey-400 capitalize !no-underline">Create Data Output model</a></li><li class="py-1 pl-3"><a href="#optional-vs-required-fields-when-creating-models" class="text-grey-400 capitalize !no-underline">Optional vs Required fields when creating models</a></li><li class="py-1 pl-3"><a href="#build-the-fetcher" class="text-grey-400 capitalize !no-underline">Build the Fetcher</a></li></ul></li><li class="py-1"><a href="#make-the-provider-visible" class="text-grey-400 capitalize !no-underline">Make the provider visible</a></li><li class="py-1"><a href="#openbb-platform-commands" class="text-grey-400 capitalize !no-underline">OpenBB Platform Commands</a></li></ul></div></div></div></div></main></div></div><footer class="px-4 border-t dark:border-grey-600/50 lg:px-12 py-14 bg-white dark:bg-grey-850 z-10 overflow-hidden flex flex-col gap-10 items-center justify-center"><div class="flex w-full justify-between md:flex-row"><div class="md:items-start mt-2"><a aria-label="Home" class="hover:text-grey-700 dark:text-white dark:hover:text-gray-50" href="/"><svg viewBox="0 0 170 17" width="170" height="17" fill="none" xmlns="http://www.w3.org/2000/svg" class="h-[14px] w-[140px]"><path d="M106.107 1.889v11.334l-.961-.946-.959-.945-.962-.943-.959-.946-.961-.943-.962-.945-.959-.944-.961-.945-.96-.943-.961-.946-.96-.943-.96-.945H92.66V17H94.582V4.723l.96.943.96.945.961.944.96.945.961.943.959.946.962.943.961.945.959.946.962.943.959.945.961.944.96.945h.961V1.889H106.107ZM137.03 7.557h-1.921V1.889h-11.524V17h15.37V7.546h-1.92l-.005.01Zm-11.524-.946V3.773h7.683v3.78h-7.683V6.61Zm11.524 3.778v4.727h-11.524v-5.67h11.524v.943ZM168.901 7.557h-2.88V1.889h-11.526V0h-1.921v1.889h1.921V17h15.365V7.546l-.959.01Zm-12.485-.946V3.773h7.684v3.78h-7.684V6.61Zm11.526 3.778v4.727h-11.526v-5.67h11.526v.943ZM75.314 1.889H61.867V17H77.23V15.111H63.787V11.332h11.521V9.443H63.788V3.777H77.23V1.89h-1.916ZM13.444 1.889H0V17h15.367V1.889h-1.922Zm0 2.834V15.11H1.918V3.773h11.527v.95ZM44.397 1.889H30.952V17h1.92v-5.666h13.445V1.88h-1.92v.009Zm0 2.834V9.45H32.873V3.773h11.524v.95Z" fill="currentColor"></path></svg></a></div><div class="justify-end"><a class="flex h-[32px] w-[172px] rounded-md border border-grey-300 hover:bg-grey-100 dark:border-white bg-grey-100 dark:bg-white text-xs hover:no-underline" href="https://github.com/OpenBB-finance/OpenBBTerminal" target="_blank" rel="noreferrer"><span class="inline-flex w-[60%] items-center gap-x-[6px] px-3 py-2 text-grey-800"><svg viewBox="0 0 24 24" width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg" style="margin-bottom:3px" class="h-[14.67px] w-[14.67px]"><path d="m12 1 3.263 7.439L23 9.403l-5.72 5.562L18.798 23 12 18.999 5.202 23l1.518-8.035L1 9.403l7.737-.964L12 1Z" stroke="currentColor" stroke-width="1.5" stroke-linejoin="round"></path></svg>Star us</span><span class="inline-flex w-[40%] items-center justify-center rounded-r-md bg-grey-850 text-grey-200">0</span></a></div></div><div class="flex w-full flex-col items-center justify-between gap-4 md:flex-row md:gap-0"><div class="flex flex-col items-start justify-end gap-4 self-start font-light text-grey-500 md:flex-row md:items-center"><p class="text-sm">© 2024 OpenBB</p><div class="_divider-x hidden h-[20px] border-[0.5px] md:block"></div><a href="https://openbb.co/legal/privacy-policy" target="_blank" rel="noopener noreferrer" class="text-sm dark:hover:text-white">Privacy Policy</a><div class="_divider-x hidden h-[20px] border-[0.5px] md:block"></div><a href="https://openbb.co/legal/terms-of-service" target="_blank" rel="noopener noreferrer" class="text-sm dark:hover:text-white">Terms</a></div><div class="mt-4 mb-10 grid grid-cols-4 gap-4 self-start md:my-0 md:grid-cols-7 md:self-end"><a aria-label="GitHub Link" class="h-8 w-8 dark:hover:!text-white hover:text-grey-700" target="_blank" rel="noreferrer" href="https://github.com/OpenBB-finance/OpenBBTerminal"><svg width="15" height="16" viewBox="0 0 15 16" fill="none" xmlns="http://www.w3.org/2000/svg" class="h-4 w-4"><path d="M6 12.76c-3.333 1-3.333-1.667-4.667-2l4.667 2Zm4.667 2v-2.58a2.246 2.246 0 0 0-.627-1.74c2.094-.233 4.294-1.027 4.294-4.667 0-.93-.359-1.825-1-2.5a3.38 3.38 0 0 0-.06-2.513s-.787-.233-2.607.987a8.92 8.92 0 0 0-4.667 0C4.18.527 3.393.76 3.393.76a3.38 3.38 0 0 0-.06 2.513 3.627 3.627 0 0 0-1 2.52c0 3.614 2.2 4.407 4.294 4.667A2.248 2.248 0 0 0 6 12.18v2.58" fill="currentColor"></path><path d="M10.667 14.76v-2.58a2.246 2.246 0 0 0-.627-1.74c2.094-.233 4.294-1.027 4.294-4.667 0-.93-.359-1.825-1-2.5a3.38 3.38 0 0 0-.06-2.513s-.787-.233-2.607.987a8.92 8.92 0 0 0-4.667 0C4.18.527 3.393.76 3.393.76a3.38 3.38 0 0 0-.06 2.513 3.627 3.627 0 0 0-1 2.52c0 3.614 2.2 4.407 4.294 4.667A2.248 2.248 0 0 0 6 12.18v2.58m0-2c-3.333 1-3.333-1.667-4.667-2l4.667 2Z" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path></svg></a><a aria-label="LinkedIn Link" class="h-8 w-8 dark:hover:!text-white hover:text-grey-700" target="_blank" rel="noreferrer" href="https://www.linkedin.com/company/openbb-finance/"><svg viewBox="0 0 24 24" width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg" class="h-4 w-4"><path d="M13 21H9V9h4v2a4.618 4.618 0 0 1 3.525-1.763A4.5 4.5 0 0 1 21 13.75V21h-4v-6.75a2.265 2.265 0 0 0-2.247-1.944A1.815 1.815 0 0 0 13 14.25V21Zm-6 0H3V9h4v12ZM5 7a2 2 0 1 1 0-4 2 2 0 0 1 0 4Z" fill="currentColor"></path></svg></a><a aria-label="Twitter Link" class="h-8 w-8 dark:hover:!text-white hover:text-grey-700" target="_blank" rel="noreferrer" href="https://twitter.com/openbb_finance"><svg viewBox="0 0 24 24" width="10" height="10" xmlns="http://www.w3.org/2000/svg" class="h-4 w-4"><path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z" fill="#E7E9EA"></path></svg></a><a aria-label="Tiktok Link" class="h-8 w-8 dark:hover:!text-white hover:text-grey-700" target="_blank" rel="noreferrer" href="https://www.tiktok.com/@openbb"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round" class="h-5 w-5 pl-[2.5px]"><path d="M0 0h24v24H0z" stroke="none"></path><path d="M9 12a4 4 0 1 0 4 4V4a5 5 0 0 0 5 5"></path></svg></a><a aria-label="Reddit Link" class="h-8 w-8 dark:hover:!text-white hover:text-grey-700" target="_blank" rel="noreferrer" href="https://www.reddit.com/r/openbb/"><svg viewBox="0 0 16 16" width="16" height="16" fill="none" xmlns="http://www.w3.org/2000/svg" class="h-4 w-4"><path d="M8 14.667A6.667 6.667 0 1 1 14.667 8 6.674 6.674 0 0 1 8 14.667ZM4.538 7.029a.973.973 0 0 0-.405 1.858 1.707 1.707 0 0 0 0 .292c0 1.494 1.743 2.708 3.886 2.708 2.142 0 3.886-1.214 3.886-2.708a1.857 1.857 0 0 0 0-.292.96.96 0 0 0-.432-1.825h-.035a.97.97 0 0 0-.638.271 4.744 4.744 0 0 0-2.567-.82l.434-2.08 1.425.3a.667.667 0 0 0 .735.591A.667.667 0 1 0 10.685 4a.667.667 0 0 0-.506.328L8.547 4a.207.207 0 0 0-.244.158l-.499 2.315a4.749 4.749 0 0 0-2.6.82.967.967 0 0 0-.666-.264Zm3.582 3.987h-.225a2.568 2.568 0 0 1-1.534-.515.18.18 0 0 1 .139-.294.18.18 0 0 1 .114.04c.374.274.825.421 1.289.42h.216c.457 0 .903-.143 1.274-.41a.187.187 0 0 1 .267 0 .19.19 0 0 1-.003.267v-.027a2.557 2.557 0 0 1-1.537.518v.001Zm1.418-1.63h-.01l.005-.025a.626.626 0 1 1 .49-.188.659.659 0 0 1-.462.214h-.024.001Zm-3.091-.053a.667.667 0 1 1 0-1.333.667.667 0 0 1 0 1.333Z" fill="currentColor"></path></svg></a><a aria-label="Discord Link" class="h-8 w-8 dark:hover:!text-white hover:text-grey-700" target="_blank" rel="noreferrer" href="https://discord.gg/xPHTuHCmuV"><svg viewBox="0 0 16 12" width="16" height="12" fill="none" xmlns="http://www.w3.org/2000/svg" class="h-4 w-4"><path d="M13.38 8.836a4.375 4.375 0 0 1-2.474 1.507c.407.481.897 1.025.901 1.03 1.655.033 3.221-.688 4.193-1.929-.05-2.572-.724-5.1-1.973-7.397A7.139 7.139 0 0 0 10.194.71h-.016l-.192.203a9.52 9.52 0 0 1 3.412 1.61 11.875 11.875 0 0 0-4.125-1.217 12.415 12.415 0 0 0-2.766.025c-.065.001-.13.008-.193.019h-.04a10.98 10.98 0 0 0-3.11.801c-.493.21-.796.362-.809.368-.013.005 0 0 0-.01A10.022 10.022 0 0 1 5.96.866L5.815.714h-.009a7.142 7.142 0 0 0-3.833 1.335A16.003 16.003 0 0 0 0 9.447c.96 1.249 2.528 1.972 4.182 1.929 0 0 .517-.583.92-1.054a4.307 4.307 0 0 1-2.405-1.496c.01.006.153.096.384.213a.17.17 0 0 0 .056.04.409.409 0 0 0 .058.031 8.043 8.043 0 0 0 1.064.462c.653.24 1.33.423 2.019.548.604.106 1.217.16 1.832.16.576 0 1.15-.049 1.717-.146a9.64 9.64 0 0 0 1.986-.546 8.203 8.203 0 0 0 1.566-.752Zm-2.94-.57c-.627.05-1.224-.26-1.502-.784a1.335 1.335 0 0 1 .244-1.581 1.612 1.612 0 0 1 1.68-.363c.586.212.973.735.973 1.319.032.745-.592 1.374-1.396 1.41h.001Zm-5.001 0c-.79-.064-1.395-.676-1.395-1.41 0-.733.606-1.345 1.395-1.408.363 0 .71.138.963.38.286.276.442.645.433 1.027.033.747-.59 1.378-1.396 1.411Z" fill="currentColor"></path></svg></a><a aria-label="Youtube Link" class="h-8 w-8 dark:hover:!text-white hover:text-grey-700" target="_blank" rel="noreferrer noopener" href="https://www.youtube.com/channel/UCaeFEx-W16IuxRsHlM1ywBQ"><svg viewBox="0 0 24 24" width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg" class="h-4 w-4"><path d="M22.54 6.42a2.78 2.78 0 0 0-1.94-2C18.88 4 12 4 12 4s-6.88 0-8.6.46a2.78 2.78 0 0 0-1.94 2A29 29 0 0 0 1 11.75a29 29 0 0 0 .46 5.33A2.78 2.78 0 0 0 3.4 19c1.72.46 8.6.46 8.6.46s6.88 0 8.6-.46a2.78 2.78 0 0 0 1.94-2c.313-1.732.467-3.49.46-5.25a29.005 29.005 0 0 0-.46-5.33v0Z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path><path d="m9.75 15.017 5.75-3.27-5.75-3.27v6.54Z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path></svg></a></div></div></footer></div>
<script src="/assets/js/runtime~main.7ef08293.js"></script>
<script src="/assets/js/main.875c0435.js"></script>
</body>
</html>