defmodule FMP do
@api_v3 "https://financialmodelingprep.com/api/v3"
@api_v4 "https://financialmodelingprep.com/api/v4"
@doc """
Fetches the trading hours for the current year from the FMP API.
"""
def trading_hours, do: get("#{@api_v3}/is-the-market-open")
@doc """
Fetches a list of all delisted companies from the FMP API.
## Optional
* `:page` - The page number to fetch.
"""
def companies_delisted(opts \\ []),
do: get("#{@api_v3}/delisted-companies", opts)
@doc """
Fetches a list of companies in the S&P 500 from the FMP API.
"""
def companies_sp500, do: get("#{@api_v3}/sp500_constituent")
@doc """
Fetches the history of companies in the S&P 500 from the FMP API.
"""
def companies_sp500_historical, do: get("#{@api_v3}/historical/sp500_constituent")
@doc """
Fetches a list of companies in the NASDAQ from the FMP API.
"""
def companies_nasdaq, do: get("#{@api_v3}/nasdaq_constituent")
@doc """
Fetches a list of companies in the Dow Jones from the FMP API.
"""
def companies_dow_jones, do: get("#{@api_v3}/dowjones_constituent")
@doc """
Fetches the history of companies in the Dow Jones from the FMP API.
"""
def companies_dow_jones_historical, do: get("#{@api_v3}/historical/dowjones_constituent")
@doc """
Fetches a company by cik from the FMP API.
## Required
* `cik` - The CIK of the company.
"""
def company_by_cik(cik) do
cik = String.pad_leading(cik, 10, "0")
case get("#{@api_v3}/cik/#{cik}") do
{:ok, resp} -> {:ok, hd(resp)}
{:error, _} = error -> error
end
end
@doc """
Fetches a company by cusip from the FMP API.
## Required
* `cusip` - The CUSIP of the company.
"""
def company_by_cusip(cusip) do
case get("#{@api_v3}/cusip/#{cusip}") do
{:ok, resp} -> {:ok, hd(resp)}
{:error, _} = error -> error
end
end
@doc """
Fetches a company profile from the FMP API.
## Required
* `symbol` - The symbol of the company.
"""
def company_profile(symbol) do
case get("#{@api_v3}/profile/#{symbol}") do
{:ok, resp} -> {:ok, hd(resp)}
{:error, _} = error -> error
end
end
@doc """
Fetches a company's outlook from the FMP API.
## Required
* `symbol` - The symbol of the company.
"""
def company_outlook(symbol),
do: get("#{@api_v4}/company-outlook", Keyword.put([], :symbol, symbol))
@doc """
Fetches a company's core information from the FMP API.
## Required
* `symbol` - The symbol of the company.
"""
def company_core_information(symbol) do
case get("#{@api_v4}/company-core-information", Keyword.put([], :symbol, symbol)) do
{:ok, resp} -> {:ok, hd(resp)}
{:error, _} = error -> error
end
end
@doc """
Fetches a company's historical employee count from the FMP API.
## Required
* `symbol` - The symbol of the company.
"""
def employee_count_historical(symbol),
do: get("#{@api_v4}/historical/employee_count", Keyword.put([], :symbol, symbol))
@doc """
Fetches a company's shares float from the FMP API.
## Required
* `symbol` - The symbol of the company.
"""
def shares_float(symbol) do
case get("#{@api_v4}/shares_float", Keyword.put([], :symbol, symbol)) do
{:ok, resp} -> {:ok, hd(resp)}
{:error, _} = error -> error
end
end
@doc """
Fetches the list of cik from the FMP API.
"""
def cik_list, do: get("#{@api_v3}/cik_list")
@doc """
Searches for a cik by name from the FMP API.
## Required
* `name` - The name of the company.
"""
def cik_search(name), do: get("#{@api_v3}/cik-search/#{name}")
@doc """
Fetches the earnings calendar from the FMP API.
## Optional
* `from` - The start date of the earnings calendar.
* `to` - The end date of the earnings calendar.
"""
def earnings_calendar(opts \\ []), do: get("#{@api_v3}/earning_calendar", opts)
@doc """
Fetches the confirmed earnings calendar from the FMP API.
## Optional
* `from` - The start date of the earnings calendar.
* `to` - The end date of the earnings calendar.
"""
def earnings_calendar_confirmed(opts \\ []),
do: get("#{@api_v4}/earning-calendar-confirmed", opts)
@doc """
Fetches the historical earnings calendar for a given symbol from the FMP API.
## Required
* `symbol` - The symbol of the company.
## Optional
* `from` - The start date of the earnings calendar.
* `to` - The end date of the earnings calendar.
"""
def earnings_calendar_historical(symbol, opts \\ []),
do: get("#{@api_v3}/historical/earning_calendar/#{symbol}", opts)
@doc """
Fetches the IPO calendar from the FMP API.
## Optional
* `from` - The start date of the IPO calendar.
* `to` - The end date of the IPO calendar.
"""
def ipo_calendar(opts \\ []), do: get("#{@api_v3}/ipo_calendar", opts)
@doc """
Fetches the IPO calendar prospectus from the FMP API.
## Optional
* `from` - The start date of the IPO calendar.
* `to` - The end date of the IPO calendar.
"""
def ipo_calendar_prospectus(opts \\ []),
do: get("#{@api_v4}/ipo-calendar-prospectus", opts)
@doc """
Fetches the confirmed IPO calendar from the FMP API.
## Optional
* `from` - The start date of the IPO calendar.
* `to` - The end date of the IPO calendar.
"""
def ipo_calendar_confirmed(opts \\ []),
do: get("#{@api_v4}/ipo-calendar-confirmed", opts)
@doc """
Fetches the stock split calendar from the FMP API.
## Optional
* `from` - The start date of the stock split calendar.
* `to` - The end date of the stock split calendar.
"""
def stock_split_calendar(opts \\ []),
do: get("#{@api_v3}/stock_split_calendar", opts)
@doc """
Fetches the dividend calendar from the FMP API.
## Optional
* `from` - The start date of the dividend calendar.
* `to` - The end date of the dividend calendar.
"""
def dividends_calendar(opts \\ []),
do: get("#{@api_v3}/stock_dividend_calendar", opts)
@doc """
Fetches the historical dividend calendar for a given symbol from the FMP API.
## Required
* `symbol` - The symbol of the company.
"""
def dividends_historical(symbol),
do: get("#{@api_v3}/historical-price-full/stock_dividend/#{symbol}")
@doc """
Fetches the economoic calendar from the FMP API.
## Optional
* `from` - The start date of the economic calendar.
* `to` - The end date of the economic calendar.
"""
def economic_calendar(opts \\ []),
do: get("#{@api_v3}/economic_calendar", opts)
@doc """
Fetches a company's financial reports dates from the FMP API.
## Required
* `symbol` - The symbol of the company.
"""
def financial_reports_dates(symbol),
do: get("#{@api_v4}/financial-reports-dates", Keyword.put([], :symbol, symbol))
@doc """
Fetches a company's income statements from the FMP API.
## Required
* `cik_or_symbol` - The CIK or symbol of the company.
## Optional
* `period` - The period of the income statements. Can be `quarter` or `annual`.
* `limit` - The number of income statements to return.
"""
def income_statements(cik_or_symbol, opts \\ []),
do: get("#{@api_v3}/income-statement/#{cik_or_symbol}", opts)
@doc """
Fetches a company's income statement growth from the FMP API.
## Required
* `symbol` - The symbol of the company.
## Optional
* `period` - The period of the income statement growth. Can be `quarter` or `annual`.
* `limit` - The number of income statement growths to return.
"""
def income_statement_growth(symbol, opts \\ []),
do: get("#{@api_v3}/income-statement-growth/#{symbol}", opts)
@doc """
Fetches a company's balance sheets from the FMP API.
## Required
* `cik_or_symbol` - The CIK or symbol of the company.
## Optional
* `period` - The period of the balance sheets. Can be `quarter` or `annual`.
* `limit` - The number of balance sheets to return.
"""
def balance_sheets(cik_or_symbol, opts \\ []),
do: get("#{@api_v3}/balance-sheet-statement/#{cik_or_symbol}", opts)
@doc """
Fetches a company's balance sheet growth from the FMP API.
## Required
* `symbol` - The symbol of the company.
## Optional
* `period` - The period of the balance sheet growths. Can be `quarter` or `annual`.
* `limit` - The number of balance sheet growths to return.
"""
def balance_sheet_growth(symbol, opts \\ []),
do: get("#{@api_v3}/balance-sheet-statement-growth/#{symbol}", opts)
@doc """
Fetches a company's cash flow statements from the FMP API.
## Required
* `cik_or_symbol` - The CIK or symbol of the company.
## Optional
* `period` - The period of the cash flow statements. Can be `quarter` or `annual`.
* `limit` - The number of cash flow statements to return.
"""
def cash_flow_statements(cik_or_symbol, opts \\ []),
do: get("#{@api_v3}/cash-flow-statement/#{cik_or_symbol}", opts)
@doc """
Fetches a company's cash flow statement growth from the FMP API.
## Required
* `symbol` - The symbol of the company.
## Optional
* `period` - The period of the cash flow statement growth. Can be `quarter` or `annual`.
* `limit` - The number of cash flow statement growths to return.
"""
def cash_flow_statement_growth(symbol, opts \\ []),
do: get("#{@api_v3}/cash-flow-statement-growth/#{symbol}", opts)
@doc """
Fetches a company's financial growth from the FMP API.
## Required
* `symbol` - The symbol of the company.
## Optional
* `period` - The period of the financial growth. Can be `quarter` or `annual`.
* `limit` - The number of financial growths to return.
"""
def financial_growth(symbol, opts \\ []),
do: get("#{@api_v3}/financial-growth/#{symbol}", opts)
@doc """
Fetches a company's revenue product segmentation from the FMP API.
## Required
* `symbol` - The symbol of the company.
"""
def product_segmentation(symbol) do
params = Keyword.new([{:symbol, symbol}, {:structure, "flat"}])
resp = get("#{@api_v4}/revenue-product-segmentation", params)
case resp do
{:ok, data} ->
reshaped_data =
Enum.map(data, fn map ->
[date_product_tuple] = Map.to_list(map)
{date, product_data} = date_product_tuple
%{
date: to_string(date),
products:
Map.to_list(product_data)
|> Enum.map(fn {product, revenue} ->
%{
name: to_string(product),
revenue: revenue
}
end)
}
end)
{:ok, reshaped_data}
{:error, _} = error ->
error
end
end
@doc """
Fetches a company's revenue geographic segmentation from the FMP API.
## Required
* `symbol` - The symbol of the company.
"""
def geographic_segmentation(symbol) do
params = Keyword.new([{:symbol, symbol}, {:structure, "flat"}])
resp = get("#{@api_v4}/revenue-geographic-segmentation", params)
case resp do
{:ok, data} ->
reshaped_data =
Enum.map(data, fn map ->
[date_country_tuple] = Map.to_list(map)
{date, country_data} = date_country_tuple
%{
date: to_string(date),
countries:
Map.to_list(country_data)
|> Enum.map(fn {country, revenue} ->
%{
name: to_string(country),
revenue: revenue
}
end)
}
end)
{:ok, reshaped_data}
{:error, _} = error ->
error
end
end
@doc """
Fetches a company's key metrics from the FMP API.
## Required
* `symbol` - The symbol of the company.
## Optional
* `period` - The period of the key metrics. Can be `quarter` or `annual`.
* `limit` - The number of key metrics to return.
"""
def key_metrics(symbol, opts \\ []), do: get("#{@api_v3}/key-metrics/#{symbol}", opts)
@doc """
Fetches a company's key metrics TTM from the FMP API.
## Required
* `symbol` - The symbol of the company.
## Optional
* `period` - The period of the key metrics. Can be `quarter` or `annual`.
* `limit` - The number of key metrics to return.
"""
def key_metrics_ttm(symbol, opts \\ []),
do: get("#{@api_v3}/key-metrics-ttm/#{symbol}", opts)
@doc """
Fetches a company's financial ratios from the FMP API.
## Required
* `symbol` - The symbol of the company.
## Optional
* `period` - The period of the financial ratios. Can be `quarter` or `annual`.
* `limit` - The number of financial ratios to return.
"""
def financial_ratios(symbol, opts \\ []), do: get("#{@api_v3}/ratios/#{symbol}", opts)
@doc """
Fetches a company's financial scores from the FMP API.
## Required
* `symbol` - The symbol of the company.
"""
def financial_scores(symbol) do
case get("#{@api_v4}/score", Keyword.put([], :symbol, symbol)) do
{:ok, resp} -> {:ok, hd(resp)}
{:error, _} = error -> error
end
end
@doc """
Fetches a company's enterprise value from the FMP API.
## Required
* `symbol` - The symbol of the company.
## Optional
* `period` - The period of the enterprise value. Can be `quarter` or `annual`.
* `limit` - The number of enterprise values to return.
"""
def enterprise_value(symbol, opts \\ []),
do: get("#{@api_v3}/enterprise-values/#{symbol}", opts)
@doc """
Fetches a company's discounted cash flow from the FMP API.
## Required
* `symbol` - The symbol of the company.
"""
def discounted_cash_flow(symbol) do
case get("#{@api_v3}/discounted-cash-flow/#{symbol}") do
{:ok, resp} -> {:ok, hd(resp)}
{:error, _} = error -> error
end
end
@doc """
Fetches a company's historical discounted cash flow from the FMP API.
## Required
* `symbol` - The symbol of the company.
## Optional
* `period` - The period of the discounted cash flow. Can be `quarter` or `annual`.
* `limit` - The number of discounted cash flows to return.
"""
def discounted_cash_flow_historical(symbol, opts \\ []),
do: get("#{@api_v3}/historical-discounted-cash-flow-statement/#{symbol}", opts)
@doc """
Fetches a company's historical daily discounted cash flow from the FMP API.
## Required
* `symbol` - The symbol of the company.
## Optional
* `limit` - The number of discounted cash flows to return.
"""
def discounted_cash_flow_historical_daily(symbol, opts \\ []),
do: get("#{@api_v3}/historical-daily-discounted-cash-flow/#{symbol}", opts)
@doc """
Fetches a company's advanced discounted cash flow TTM from the FMP API.
## Required
* `symbol` - The symbol of the company.
"""
def advanced_discounted_cash_flow(symbol),
do: get("#{@api_v4}/advanced_discounted_cash_flow", Keyword.put([], :symbol, symbol))
@doc """
Fetches a company's advanced levered discounted cash flow from the FMP API.
## Required
* `symbol` - The symbol of the company.
"""
def advanced_levered_discounted_cash_flow(symbol),
do: get("#{@api_v4}/advanced_levered_discounted_cash_flow", Keyword.put([], :symbol, symbol))
@doc """
Fetches a company's insider roster from the FMP API.
## Required
* `symbol` - The symbol of the company.
"""
def insider_roster(symbol),
do: get("#{@api_v4}/insider-roaster", Keyword.put([], :symbol, symbol))
@doc """
Fetches a company's insider roster statistics from the FMP API.
## Required
* `symbol` - The symbol of the company.
"""
def insider_roster_statistics(symbol),
do: get("#{@api_v4}/insider-roaster-statistic", Keyword.put([], :symbol, symbol))
@doc """
Fetches a company's key executives from the FMP API.
## Required
* `symbol` - The symbol of the company.
"""
def key_executives(symbol), do: get("#{@api_v3}/key-executives/#{symbol}")
@doc """
Fetches a company's executive compensation from the FMP API.
## Required
* `symbol` - The symbol of the company.
"""
def executive_compensation(symbol),
do: get("#{@api_v4}/governance/executive_compensation", Keyword.put([], :symbol, symbol))
@doc """
Fetches the executive compensation benchmark for a year from the FMP API.
## Required
* `year` - The year to fetch the benchmark for.
"""
def executive_compensation_benchmark(year),
do: get("#{@api_v4}/executive-compensation-benchmark", Keyword.put([], :year, year))
@doc """
Fetches a company's market capitalization from the FMP API.
## Required
* `symbol` - The symbol of the company.
"""
def market_cap(symbol) do
case get("#{@api_v3}/market-capitalization/#{symbol}") do
{:ok, resp} -> {:ok, hd(resp)}
{:error, _} = error -> error
end
end
@doc """
Fetches a company's historical market capitalization from the FMP API.
## Required
* `symbol` - The symbol of the company.
## Optional
* `limit` - The number of results to return.
"""
def market_cap_historical(symbol, opts \\ []),
do: get("#{@api_v3}/historical-market-capitalization/#{symbol}", opts)
@doc """
Fetches a company's peers from the FMP API.
## Required
* `symbol` - The symbol of the company.
"""
def peers(symbol) do
case get("#{@api_v4}/stock_peers", Keyword.put([], :symbol, symbol)) do
{:ok, resp} -> {:ok, hd(resp)}
{:error, _} = error -> error
end
end
@doc """
Fetches a company's SIC information using CIK from the FMP API.
## Required
* `cik` - The CIK of the company.
"""
def sic_by_cik(cik) do
cik = String.pad_leading(cik, 10, "0")
case get("#{@api_v4}/standard_industrial_classification", Keyword.put([], :cik, cik)) do
{:ok, resp} -> {:ok, hd(resp)}
{:error, _} = error -> error
end
end
@doc """
Fetches a company's SIC information using symbol from the FMP API.
## Required
* `symbol` - The symbol of the company.
"""
def sic_by_symbol(symbol) do
case get("#{@api_v4}/standard_industrial_classification", Keyword.put([], :symbol, symbol)) do
{:ok, resp} -> {:ok, hd(resp)}
{:error, _} = error -> error
end
end
@doc """
Fetches SIC information for SIC code from the FMP API.
## Required
* `sic_code` - The SIC code to fetch information for.
"""
def sic_by_code(sic_code),
do: get("#{@api_v4}/standard_industrial_classification", Keyword.put([], :sicCode, sic_code))
@doc """
Fetches all SIC information from the FMP API.
"""
def sic_all, do: get("#{@api_v4}/standard_industrial_classification/all")
@doc """
Fetches a list of SIC codes from the FMP API.
## Optional
* `industry` - The industry to fetch SIC codes for.
* `sicCode` - The SIC code to fetch information for.
"""
def sic_list(opts \\ []),
do: get("#{@api_v4}/standard_industrial_classification_list", opts)
@doc """
Fetches a company's historical chart from the FMP API.
## Required
* `interval` - The interval to fetch historical data for.
* `symbol` - The symbol of the company.
"""
def chart_historical(interval, symbol),
do: get("#{@api_v3}/historical-chart/#{interval}/#{symbol}")
@doc """
Fetches historical chart with full data for the symbols from the FMP API.
## Required
* `symbols` - The symbols of the companies.
## Optional
* `from` - The start date of the historical data.
* `to` - The end date of the historical data.
* `serietype` - The type of series to fetch.
"""
def chart_historical_full(symbols, opts \\ []),
do: get("#{@api_v3}/historical-price-full/#{symbols}", opts)
@doc """
Fetches quotes for an exchange from the FMP API.
## Required
* `exchange` - The exchange to fetch quotes for.
"""
def quotes(exchange), do: get("#{@api_v3}/quotes/#{exchange}")
@doc """
Fetches quotes from the FMP API.
## Required
* `symbols` - The symbols of the companies.
"""
def quote(symbols), do: get("#{@api_v3}/quote/#{symbols}")
@doc """
Fetches short quotes from the FMP API.
## Required
* `symbols` - The symbols of the companies.
"""
def quote_short(symbols), do: get("#{@api_v3}/quote-short/#{symbols}")
@doc """
Fetches price changes from the FMP API.
## Required
* `symbols` - The symbols of the companies.
"""
def price_change(symbols), do: get("#{@api_v3}/stock-price-change/#{symbols}")
@doc """
Fetches a OTC prices from the FMP API.
## Required
* `symbols` - The symbols of the companies.
"""
def otc_prices(symbols), do: get("#{@api_v3}/otc/real-time-price/#{symbols}")
@doc """
Fetches a FOREX prices from the FMP API.
"""
def forex, do: get("#{@api_v3}/fx")
@doc """
Fetches all of the FOREX quotes from the FMP API.
"""
def forex_quotes, do: get("#{@api_v3}/quotes/forex")
@doc """
Fetches a FOREX exchange rates for a pair from the FMP API.
## Required
* `pair` - The pair of currencies.
"""
def exchange_rates(pair) do
case get("#{@api_v3}/fx/#{pair}") do
{:ok, resp} -> {:ok, hd(resp)}
{:error, _} = error -> error
end
end
@doc """
Fetches a company's technical indicator from the FMP API.
## Required
* `symbol` - The symbol of the company.
* `interval` - The interval of the technical indicator.
## Optional
* `period` - The period of the technical indicator.
* `type` - The series type of the technical indicator.
"""
def technical_indicator(symbol, interval, opts \\ []),
do: get("#{@api_v3}/technical_indicator/#{interval}/#{symbol}", opts)
@doc """
Fetches a company's historical stock splits from the FMP API.
## Required
* `symbol` - The symbol of the company.
"""
def stock_splits(symbol), do: get("#{@api_v3}/historical-price-full/stock_split/#{symbol}")
@doc """
Fetches a company's price targets from the FMP API.
## Required
* `symbol` - The symbol of the company.
"""
def price_targets(symbol), do: get("#{@api_v4}/price-target", Keyword.put([], :symbol, symbol))
@doc """
Fetches a company's price targets consensus from the FMP API.
## Required
* `symbol` - The symbol of the company.
"""
def price_targets_consenus(symbol) do
case get("#{@api_v4}/price-target-consensus", Keyword.put([], :symbol, symbol)) do
{:ok, resp} -> {:ok, hd(resp)}
{:error, _} = error -> error
end
end
@doc """
Fetches a company's price target summary from the FMP API.
## Required
* `symbol` - The symbol of the company.
"""
def price_target_summary(symbol) do
case get("#{@api_v4}/price-target-summary", Keyword.put([], :symbol, symbol)) do
{:ok, resp} -> {:ok, hd(resp)}
{:error, _} = error -> error
end
end
@doc """
Fetches a list of price targets by an analyst from the FMP API.
## Required
* `analyst_name` - The name of the analyst.
"""
def price_targets_by_analyst(analyst_name),
do: get("#{@api_v4}/price-target-analyst-name", Keyword.put([], :name, analyst_name))
@doc """
Fetches a list of price targets by an analyst company from the FMP API.
## Required
* `company` - The name of the analyst company.
"""
def price_targets_by_analyst_company(company),
do: get("#{@api_v4}/price-target-analyst-company", Keyword.put([], :company, company))
@doc """
Fetches a company's upgrades and downgrades from the FMP API.
## Required
* `symbol` - The symbol of the company.
"""
def upgrades_and_downgrades(symbol),
do: get("#{@api_v4}/upgrades-downgrades", Keyword.put([], :symbol, symbol))
@doc """
Fetches a company's upgrades and downgrades consensus from the FMP API.
## Required
* `symbol` - The symbol of the company.
"""
def upgrades_and_downgrades_consenus(symbol) do
case get("#{@api_v4}/upgrades-downgrades-consensus", Keyword.put([], :symbol, symbol)) do
{:ok, resp} -> {:ok, hd(resp)}
{:error, _} = error -> error
end
end
@doc """
Fetches a list of upgrades and downgrades by an analyst company from the FMP API.
## Required
* `company` - The name of the analyst company.
"""
def upgrades_and_downgrades_by_company(company),
do: get("#{@api_v4}/upgrades-downgrades-grading-company", Keyword.put([], :company, company))
@doc """
Fetches a company's rating from the FMP API.
## Required
* `symbol` - The symbol of the company.
"""
def rating(symbol) do
case get("#{@api_v3}/rating/#{symbol}") do
{:ok, resp} -> {:ok, hd(resp)}
{:error, _} = error -> error
end
end
@doc """
Fetches a company's historical rating from the FMP API.
## Required
* `symbol` - The symbol of the company.
## Optional
* `limit` - The number of results to return.
"""
def rating_historical(symbol, opts \\ []),
do: get("#{@api_v3}/historical-rating/#{symbol}", opts)
@doc """
Fetches a company's social sentiment from the FMP API.
## Required
* `symbol` - The symbol of the company.
* `page` - The page of the results to fetch.
"""
def social_sentiment(symbol, page \\ 0) do
params = Keyword.new([{:symbol, symbol}, {:page, page}])
get("#{@api_v4}/historical/social-sentiment", params)
end
@doc """
Fetches a company's stock grade from the FMP API.
## Required
* `symbol` - The symbol of the company.
## Paramaters
* `limit` - The number of results to return.
"""
def stock_grade(symbol, opts \\ []),
do: get("#{@api_v4}/grade", Keyword.put(opts, :symbol, symbol))
@doc """
Fetches a company's earnings surprises from the FMP API.
## Required
* `symbol` - The symbol of the company.
"""
def earnings_surprises(symbol),
do: get("#{@api_v3}/earnings-surprises/#{symbol}")
@doc """
Fetches a company's analyst estimates from the FMP API.
## Required
* `symbol` - The symbol of the company.
## Optional
* `limit` - The number of results to return.
* `period` - The period of the analyst estimates.
"""
def analyst_estimates(symbol, opts \\ []),
do: get("#{@api_v3}/analyst-estimates/#{symbol}", opts)
@doc """
Fetches a list of a company's earnings call transcripts from the FMP API.
## Required
* `symbol` - The symbol of the company.
"""
def earnings_call_transcript(symbol),
do: get("#{@api_v4}/earning_call_transcript", Keyword.put([], :symbol, symbol))
@doc """
Fetches the earnings call transcripts for a company for a given year.
## Required
* `symbol` - The symbol of the company.
* `year` - The year of the earnings call transcript.
"""
def earnings_call_transcript(symbol, year),
do: get("#{@api_v4}/batch_earning_call_transcript/#{symbol}", Keyword.put([], :year, year))
@doc """
Fetches the earnings call transcripts for a company for a given year and quarter.
## Required
* `symbol` - The symbol of the company.
* `year` - The year of the earnings call transcript.
* `quarter` - The quarter of the earnings call transcript.
"""
def earnings_call_transcript(symbol, year, quarter) do
params = Keyword.new([{:year, year}, {:quarter, quarter}])
case get("#{@api_v3}/earning_call_transcript/#{symbol}", params) do
{:ok, resp} -> {:ok, hd(resp)}
{:error, _} = error -> error
end
end
@doc """
Fetches a list of company's notes from the FMP API.
## Required
* `symbol` - The symbol of the company.
"""
def company_notes(symbol), do: get("#{@api_v4}/company-notes", Keyword.put([], :symbol, symbol))
@doc """
Fetches a company's ESG score from the FMP API.
## Required
* `symbol` - The symbol of the company.
"""
def esg_scores(symbol),
do:
get("#{@api_v4}/esg-environmental-social-governance-data", Keyword.put([], :symbol, symbol))
@doc """
Fetches a company's ESG risk rating from the FMP API.
## Required
* `symbol` - The symbol of the company.
"""
def esg_risk_ratings(symbol),
do:
get(
"#{@api_v4}/esg-environmental-social-governance-data-ratings",
Keyword.put([], :symbol, symbol)
)
@doc """
Fetches a sector ESG score benchmarks from the FMP API.
## Required
* `year` - The year of the ESG score benchmarks.
"""
def esg_sector_benchmarks(year),
do:
get(
"#{@api_v4}/esg-environmental-social-governance-sector-benchmark",
Keyword.put([], :year, year)
)
@doc """
Fetches a company's mutual fund holders from the FMP API.
## Required
* `symbol` - The symbol of the company.
"""
def mutual_fund_holders(symbol), do: get("#{@api_v3}/mutual-fund-holder/#{symbol}")
@doc """
Fetches a company's institutional holders from the FMP API.
## Required
* `symbol` - The symbol of the company.
"""
def institutional_holders(symbol), do: get("#{@api_v3}/institutional-holder/#{symbol}")
@doc """
Fetches form 13F for a given CIK from the FMP API.
## Required
* `cik` - The CIK of the company.
* `date` - The date of the form 13F.
"""
def form_13f(cik, date) do
cik = String.pad_leading(cik, 10, "0")
get("#{@api_v3}/form-thirteen/#{cik}", Keyword.put([], :date, date))
end
@doc """
Fetches form 13F filing dates for a given CIK from the FMP API.
## Required
* `cik` - The CIK of the company.
"""
def form_13f_filing_dates(cik) do
cik = String.pad_leading(cik, 10, "0")
get("#{@api_v3}/form-thirteen-date/#{cik}")
end
@doc """
Fetches form 13F allocation dates from the FMP API.
"""
def form_13f_asset_allocation_dates, do: get("#{@api_v4}/13f-asset-allocation-date")
@doc """
Fetches form 13F asset allocations for a given date from the FMP API.
## Required
* `date` - The date of the form 13F asset allocation.
"""
def form_13f_asset_allocations(date),
do: get("#{@api_v4}/13f-asset-allocation-date", Keyword.put([], :date, date))
@doc """
Fetches a company's institutional ownership from the FMP API.
## Required
* `symbol` - The symbol of the company.
"""
def insider_ownership_acquisition(symbol),
do:
get(
"#{@api_v4}/insider/ownership/acquisition_of_beneficial_ownership",
Keyword.put([], :symbol, symbol)
)
@doc """
Fetches a company's institutional ownership from the FMP API.
## Required
* `symbol` - The symbol of the company.
"""
def institutional_ownership(symbol),
do:
get("#{@api_v4}/institutional-ownership/symbol-ownership", Keyword.put([], :symbol, symbol))
@doc """
Fetches a company's institutional ownership percentage from the FMP API.
## Required
* `symbol` - The symbol of the company.
## Optional
* `date` - The date of the institutional ownership percentage.
* `page` - The page number of the results.
"""
def institutional_ownership_percentage(symbol, opts \\ []),
do:
get(
"#{@api_v4}/institutional-ownership/institutional-holders/symbol-ownership-percent",
Keyword.put(opts, :symbol, symbol)
)
@doc """
Fetches a company's institutional ownership by shares held from the FMP API.
## Required
* `symbol` - The symbol of the company.
## Optional
* `date` - The date of the institutional ownership percentage.
* `page` - The page number of the results.
"""
def institutional_ownership_by_shares_held(symbol, opts \\ []),
do:
get(
"#{@api_v4}/institutional-ownership/institutional-holders/symbol-ownership",
Keyword.put(opts, :symbol, symbol)
)
@doc """
Fetches a institution's portfolio holdings from the FMP API.
## Required
* `cik` - The CIK of the institution.
## Optional
* `date` - The date of the portfolio holdings.
* `page` - The page number of the results.
"""
def institution_portfolio_holdings(cik, opts \\ []),
do: get("#{@api_v4}/institutional-ownership/portfolio-holdings", Keyword.put(opts, :cik, cik))
@doc """
Fetches a institution's portfolio summary from the FMP API.
## Required
* `cik` - The CIK of the institution.
"""
def institution_portfolio_summary(cik) do
cik = String.pad_leading(cik, 10, "0")
get(
"#{@api_v4}/institutional-ownership/portfolio-holdings-summary",
Keyword.put([], :cik, cik)
)
end
@doc """
Fetches a institution's portfolio dates from the FMP API.
## Required
* `cik` - The CIK of the institution.
"""
def institution_portfolio_dates(cik) do
cik = String.pad_leading(cik, 10, "0")
get("#{@api_v4}/institutional-ownership/portfolio-date", Keyword.put([], :cik, cik))
end
@doc """
Fetches a institution's portfolio industry summary from the FMP API.
## Required
* `cik` - The CIK of the institution.
* `date` - The date of the portfolio holdings.
## Optional
* `page` - The page number of the results.
"""
def institution_industry_summary(cik, date, opts \\ []) do
cik = String.pad_leading(cik, 10, "0")
params =
Keyword.new([
{:cik, cik},
{:date, date}
])
|> Keyword.merge(opts)
get("#{@api_v4}/institutional-ownership/industry/portfolio-holdings-summary", params)
end
@doc """
Fetches insider trading transactions from the FMP API.
## Optional
* `symbol` - The symbol of the stock.
* `companyCik` - The CIK of the company.
* `reportingCik` - The CIK of the reporting institution.
* `transactionType` - The type of transaction.
* `page` - The page number of the results.
"""
def insider_trading(opts \\ []),
do: get("#{@api_v4}/insider-trading", opts)
@doc """
Fetches insider trading transactions types from the FMP API.
"""
def insider_trading_transactions_type, do: get("#{@api_v4}/insider-trading-transaction-type")
@doc """
Fetches a list of commitment of traders report from the FMP API.
"""
def commitment_of_traders_report_list, do: get("#{@api_v4}/commitment_of_traders_report/list")
@doc """
Fetches a commitment of traders report from and to a date from the FMP API.
## Required
* `from` - The from date.
* `to` - The to date.
"""
def commitment_of_traders_report(from, to) do
params = Keyword.new([{:from, from}, {:to, to}])
get("#{@api_v4}/commitment_of_traders_report", params)
end
@doc """
Fetches a commitment of traders report from a symbol from the FMP API.
## Required
* `symbol` - The symbol.
"""
def commitment_of_traders_report(symbol),
do: get("#{@api_v4}/commitment_of_traders_report/#{symbol}")
@doc """
Fetches a commitment of traders report analysis from and to a date from the FMP API.
## Required
* `from` - The from date.
* `to` - The to date.
"""
def commitment_of_traders_report_analysis(from, to) do
params = Keyword.new([{:from, from}, {:to, to}])
get("#{@api_v4}/commitment_of_traders_report_analysis", params)
end
@doc """
Fetches a commitment of traders report analysis from a symbol from the FMP API.
## Required
* `symbol` - The symbol.
"""
def commitment_of_traders_report_analysis(symbol),
do: get("#{@api_v4}/commitment_of_traders_report_analysis/#{symbol}")
@doc """
Fetches a list of senate trading for a symbol from the FMP API.
## Required
* `symbol` - The symbol of the company.
"""
def senate_trading(symbol),
do: get("#{@api_v4}/senate-trading", Keyword.put([], :symbol, symbol))
@doc """
Fetches a list of senate disclosures for a symbol from the FMP API.
## Required
* `symbol` - The symbol of the company.
"""
def senate_disclosures(symbol),
do: get("#{@api_v4}/senate-disclosure", Keyword.put([], :symbol, symbol))
@doc """
Fetches ciks by name from the FMP API.
## Optional
* `name` - The name of the company.
* `page` - The page number.
"""
def cik_mapper_name(opts \\ []),
do: get("#{@api_v4}/mapper-cik-name", opts)
@doc """
Fetches ciks by symbol from the FMP API.
## Required
* `symbol` - The symbol of the company.
"""
def cik_mapper_company(symbol) do
case get("#{@api_v4}/mapper-cik-company/#{symbol}") do
{:ok, resp} -> {:ok, hd(resp)}
{:error, _} = error -> error
end
end
@doc """
Fetches the symbols of all companies from the FMP API.
"""
def symbols, do: get("#{@api_v3}/stock/list")
@doc """
Fetches the symbols of all tradable companies from the FMP API.
"""
def symbols_exchanges, do: get("#{@api_v3}/available-traded/list")
@doc """
Fetches the symbols of all indexes from the FMP API.
"""
def symbols_indexes, do: get("#{@api_v3}/symbol/available-indexes")
@doc """
Fetches the symbols of all euro next companies from the FMP API.
"""
def symbols_euronext, do: get("#{@api_v3}/symbol/available-euronext")
@doc """
Fetches the symbols of all TSX companies from the FMP API.
"""
def symbols_tsx, do: get("#{@api_v3}/symbol/available-tsx")
@doc """
Fetches the symbols of all crypto currencies from the FMP API.
"""
def symbols_crypto, do: get("#{@api_v3}/symbol/available-cryptocurrencies")
@doc """
Fetches the symbols of all forex currencies from the FMP API.
"""
def symbols_forex, do: get("#{@api_v3}/symbol/available-forex-currency-pairs")
@doc """
Fetches the symbols of all commodities from the FMP API.
"""
def symbols_commodities, do: get("#{@api_v3}/symbol/available-commodities")
@doc """
Fetches the symbol changes from the FMP API.
"""
def symbol_changes, do: get("#{@api_v4}/symbol_change")
@doc """
Fetches mutual funds by name from the FMP API.
## Required
* `name` - The name of the mutual fund.
"""
def mutual_fund(name),
do: get("#{@api_v4}/mutual-fund-holdings/name", Keyword.put([], :name, name))
@doc """
Fetches mutual funds holdings from the FMP API.
## Optional
* `symbol` - The symbol of the mutual fund.
* `cik` - The CIK of the mutual fund.
* `date` - The date of the mutual fund.
"""
def mutual_fund_portfolio_holdings(opts \\ []),
do: get("#{@api_v4}/mutual-fund-holdings", opts)
@doc """
Fetches mutual funds portfolio dates from the FMP API.
## Optional
* `symbol` - The symbol of the mutual fund.
* `cik` - The CIK of the mutual fund.
"""
def mutual_fund_portfolio_dates(opts \\ []),
do: get("#{@api_v4}/mutual-fund-holdings/portfolio-date", opts)
@doc """
Fetches the symbols of all ETFs from the FMP API.
"""
def etfs, do: get("#{@api_v3}/etf/list")
@doc """
Fetches information about an ETF from the FMP API.
## Required
* `symbol` - The symbol of the ETF.
"""
def etf(symbol) do
case get("#{@api_v4}/etf-info", Keyword.put([], :symbol, symbol)) do
{:ok, resp} -> {:ok, hd(resp)}
{:error, _} = error -> error
end
end
@doc """
Fetches the portfolio dates of an ETF from the FMP API.
## Optional
* `symbol` - The symbol of the ETF.
* `cik` - The CIK of the ETF.
"""
def etf_portfolio_dates(opts \\ []),
do: get("#{@api_v4}/etf-holdings/portfolio-date", opts)
@doc """
Fetches the holdings of an ETF from the FMP API.
## Required
* `symbol` - The symbol of the ETF.
"""
def etf_holdings(symbol), do: get("#{@api_v3}/etf-holder/#{symbol}")
@doc """
Fetches the historical holdings of an ETF from the FMP API.
## Optional
* `symbol` - The symbol of the ETF.
* `ciK` - The CIK of the ETF.
* `date` - The date of the holdings.
"""
def etf_holdings_historical(opts \\ []), do: get("#{@api_v4}/etf-holdings", opts)
@doc """
Fetches the stock exposure of an ETF from the FMP API.
## Required
* `symbol` - The symbol of the ETF.
"""
def etf_stock_exposure(symbol), do: get("#{@api_v3}/etf-stock-exposure/#{symbol}")
@doc """
Fetches the country weightings of an ETF from the FMP API.
## Required
* `symbol` - The symbol of the ETF.
"""
def etf_country_weightings(symbol), do: get("#{@api_v3}/etf-country-weightings/#{symbol}")
@doc """
Fetches the sector weightings of an ETF from the FMP API.
## Required
* `symbol` - The symbol of the ETF.
"""
def etf_sector_weightings(symbol), do: get("#{@api_v3}/etf-sector-weightings/#{symbol}")
@doc """
Fetches sectors PE ratios for a given date from the FMP API.
## Required
* `date` - The date of the PE ratios.
## Optional
* `exchange` - The exchange of the PE ratios.
"""
def pe_ratios_sectors(date, opts \\ []),
do: get("#{@api_v4}/sector_price_earning_ratio", Keyword.put(opts, :date, date))
@doc """
Fetches industries PE ratios for a given date from the FMP API.
## Required
* `date` - The date of the PE ratios.
## Optional
* `exchange` - The exchange of the PE ratios.
"""
def pe_ratios_industries(date, opts \\ []),
do: get("#{@api_v4}/industry_price_earning_ratio", Keyword.put(opts, :date, date))
@doc """
Fetches sectors performance from the FMP API.
"""
def sectors_performance, do: get("#{@api_v3}/sector-performance")
@doc """
Fetches historical sectors performance from the FMP API.
## Optional
* `limit` - The limit of the historical sectors performance.
"""
def sectors_performance_historical(opts \\ []),
do: get("#{@api_v3}/historical-sectors-performance", opts)
@doc """
Fetches top gainers from the FMP API.
"""
def top_gainers, do: get("#{@api_v3}/stock_market/gainers")
@doc """
Fetches top losers from the FMP API.
"""
def top_losers, do: get("#{@api_v3}/stock_market/losers")
@doc """
Fetches most active stocks from the FMP API.
"""
def top_active, do: get("#{@api_v3}/stock_market/actives")
@doc """
Fetches market risk premiums for each country from the FMP API.
"""
def market_risk_preminum, do: get("#{@api_v4}/market_risk_premium")
@doc """
Fetches treasury rates from the FMP API.
## Optional
* `from` - The start date of the treasury rates.
* `to` - The end date of the treasury rates.
"""
def treasury_rates(opts \\ []), do: get("#{@api_v4}/treasury", opts)
@doc """
Fetches economic indicators from the FMP API.
## Required
* `name` - The name of the economic indicator.
## Optional
* `from` - The start date of the economic indicator.
* `to` - The end date of the economic indicator.
"""
def ecomonic_indicators(name, opts \\ []),
do: get("#{@api_v4}/economic", Keyword.put(opts, :name, name))
@doc """
Fetches crowdfunding offerings from the FMP API.
## Required
* `cik` - The CIK of the company.
"""
def crowdfunding_offerings(cik) do
cik = String.pad_leading(cik, 10, "0")
get("#{@api_v4}/crowdfunding-offerings", Keyword.put([], :cik, cik))
end
@doc """
Fetches fundraising from the FMP API.
## Required
* `cik` - The CIK of the company.
"""
def fundraising(cik) do
cik = String.pad_leading(cik, 10, "0")
get("#{@api_v4}/fundraising", Keyword.put([], :cik, cik))
end
@doc """
Fetches the list of FMP articles from the FMP API.
## Optional
* `page` - The page number.
* `size` - The size of the pages.
"""
def fmp_articles(opts \\ []), do: get("#{@api_v3}/fmp/articles", opts)
@doc """
Fetches the list of stock news from the FMP API.
## Optional
* `tickers` - The list of tickers.
* `limit` - The number of news to return.
* `page` - The page number.
"""
def news_stock(opts \\ []), do: get("#{@api_v3}/stock_news", opts)
@doc """
Fetches the list of crypto news from the FMP API.
## Optional
* `symbol` - The symbol of the crypto.
* `page` - The page number.
"""
def news_crypto(opts \\ []), do: get("#{@api_v4}/crypto_news", opts)
@doc """
Fetches the list of forex news from the FMP API.
## Optional
* `symbol` - The symbol of the crypto.
* `page` - The page number.
"""
def news_forex(opts \\ []), do: get("#{@api_v4}/forex_news", opts)
@doc """
Fetches the list of general news from the FMP API.
## Required
* `page` - The page number.
"""
def news_general(page \\ 0), do: get("#{@api_v4}/general_news", Keyword.put([], :page, page))
@doc """
Fetches the list of press releases from the FMP API.
## Required
* `symbol` - The symbol of the company.
* `page` - The page number.
"""
def press_releases(symbol, page \\ 0),
do: get("#{@api_v3}/press-releases/#{symbol}", Keyword.put([], :page, page))
@doc """
Fetches the list of sec filings of a company from the FMP API.
## Required
* `symbol` - The symbol of the company.
## Optional
* `type` - The type of the filing.
* `page` - The page number.
"""
def sec_filings(symbol, opts \\ []), do: get("#{@api_v3}/sec_filings/#{symbol}", opts)
@doc """
Fetches the SEC rss feed from the FMP API.
## Required
* `page` - The page number.
"""
def rss_feed(page \\ 0), do: get("#{@api_v3}/rss_feed", Keyword.put([], :page, page))
@doc """
Fetches the insider trading rss feed from the FMP API.
## Required
* `page` - The page number.
"""
def rss_feed_insider_trading(page \\ 0),
do: get("#{@api_v4}/insider-trading-rss-feed", Keyword.put([], :page, page))
@doc """
Fetches the price targets rss feed from the FMP API.
## Required
* `page` - The page number.
"""
def rss_feed_price_targets(page \\ 0),
do: get("#{@api_v4}/price-target-rss-feed", Keyword.put([], :page, page))
@doc """
Fetches the upgrades and downgrades rss feed from the FMP API.
## Required
* `page` - The page number.
"""
def rss_feed_upgrades_and_downgrades(page \\ 0),
do: get("#{@api_v4}/upgrades-downgrades-rss-feed", Keyword.put([], :page, page))
@doc """
Fetches the stock news sentiment rss feed from the FMP API.
## Required
* `page` - The page number.
"""
def rss_feed_stock_news_sentiment(page \\ 0),
do: get("#{@api_v4}/stock-news-sentiments-rss-feed", Keyword.put([], :page, page))
@doc """
Fetches the institutional ownership rss feed from the FMP API.
## Required
* `page` - The page number.
"""
def rss_feed_institutional_ownership(page \\ 0),
do: get("#{@api_v4}/institutional-ownership/rss_feed", Keyword.put([], :page, page))
@doc """
Fetches the senate trading rss feed from the FMP API.
## Required
* `page` - The page number.
"""
def rss_feed_senate_trading(page \\ 0),
do: get("#{@api_v4}/senate-trading-rss-feed", Keyword.put([], :page, page))
@doc """
Fetches the senate disclosures rss feed from the FMP API.
## Required
* `page` - The page number.
"""
def rss_feed_senate_disclosures(page \\ 0),
do: get("#{@api_v4}/senate-disclosure-rss-feed", Keyword.put([], :page, page))
@doc """
Fetches the mergers and acquisitions rss feed from the FMP API.
## Required
* `page` - The page number.
"""
def rss_feed_mergers_and_acquisitions(page \\ 0),
do: get("#{@api_v4}/mergers-acquisitions-rss-feed", Keyword.put([], :page, page))
@doc """
Fetches the crowdfunding offerings rss feed from the FMP API.
## Required
* `page` - The page number.
"""
def rss_feed_crowdfunding_offerings(page \\ 0),
do: get("#{@api_v4}/crowdfunding-offerings-rss-feed", Keyword.put([], :page, page))
@doc """
Fetches the fundraising rss feed from the FMP API.
## Required
* `page` - The page number.
"""
def rss_feed_fundraising(page \\ 0),
do: get("#{@api_v4}/fundraising-rss-feed", Keyword.put([], :page, page))
@doc """
Search via ticker and company name from the FMP API.
## Required
* `query` - The query to search for.
## Optional
* `limit` - The number of results to return.
* `exchange` - The exchange to search in.
"""
def search(query, opts \\ []),
do: get("#{@api_v3}/search", Keyword.put(opts, :query, query))
@doc """
Search via ticker from the FMP API.
## Required
* `query` - The query to search for.
## Optional
* `limit` - The number of results to return.
* `exchange` - The exchange to search in.
"""
def search_ticker(query, opts \\ []),
do: get("#{@api_v3}/search-ticker", Keyword.put(opts, :query, query))
@doc """
Search via company name from the FMP API.
## Required
* `query` - The query to search for.
## Optional
* `limit` - The number of results to return.
* `exchange` - The exchange to search in.
"""
def search_name(query, opts \\ []),
do: get("#{@api_v3}/search-name", Keyword.put(opts, :query, query))
@doc """
Search for institutions from the FMP API.
## Required
* `name` - The name of the institution to search for.
"""
def search_institutions(name),
do: get("#{@api_v4}/institutional-ownership/name", Keyword.put([], :name, name))
@doc """
Search for mergers and acquisitions from the FMP API.
## Required
* `name` - The name of the merger or acquisition to search for.
"""
def search_mergers_and_acquisitions(name),
do: get("#{@api_v4}/mergers-acquisitions/search", Keyword.put([], :name, name))
@doc """
Search for crowdfunding offerings from the FMP API.
## Required
* `name` - The name of the crowdfunding offering to search for.
"""
def search_crowdfunding_offerings(name),
do: get("#{@api_v4}/crowdfunding-offerings/search", Keyword.put([], :name, name))
@doc """
Search for fundraising from the FMP API.
## Required
* `name` - The name of the fundraising to search for.
"""
def search_fundraising(name),
do: get("#{@api_v4}/fundraising/search", Keyword.put([], :name, name))
@doc """
Screen stocks from the FMP API.
## Optional
* `marketCapMoreThan` - The market cap to screen for.
* `marketCapLowerThan` - The market cap to screen for.
* `priceMoreThan` - The price to screen for.
* `priceLowerThan` - The price to screen for.
* `volumeMoreThan` - The volume to screen for.
* `volumeLowerThan` - The volume to screen for.
* `betaMoreThan` - The beta to screen for.
* `betaLowerThan` - The beta to screen for.
* `dividendMoreThan` - The dividend to screen for.
* `dividendLowerThan` - The dividend to screen for.
* `isEtf` - Whether or not to screen for ETFs.
* `sector` - The sector to screen for.
* `industry` - The industry to screen for.
* `exchange` - The exchange to screen for.
* `country` - The country to screen for.
* `limit` - The number of results to return.
"""
def screener(opts \\ []), do: get("#{@api_v3}/stock-screener", opts)
@doc false
defp get(url, params \\ []) do
api_key = Application.get_env(:fmp_client, :api_key)
params = params |> Keyword.put_new(:apikey, api_key)
case Req.get(url, params: params, decode_json: [keys: :atoms]) do
{:ok, %Req.Response{status: 200, body: body}} ->
case body do
%{"Error Message" => error} ->
{:error, error}
_ ->
{:ok, body}
end
{:ok, %Req.Response{status: 403}} ->
{:error, "invalid subscription"}
{:ok, %Req.Response{status: code}} ->
{:error, "request failed with status: #{code}"}
{:error, error} ->
{:error, error}
end
end
end