Repository navigation
Releases
π LibFMP 1.5.0
π LibFMP 1.4.0
1.4.0 (2026-10-06)
π Features
- client: add execute_with_metadata for status and headers (9c425fb)
- client: add on_response observer for successful calls (cf82149)
- config: add from_env constructors for proxy base URL and key (b11f9f0)
- error: keep allowlisted response headers on Error (86ae26f)
- fmp-py: add FmpClient on_response success callback (5bf943d), closes #417
- fmp-py: expose retry_after, headers, proxy_error on errors (9ebf240), closes #416
- fmp-py: read FMP_BASE_URL when base_url is omitted (c08f808), closes #415
- sdk/go: add NewClientFromEnv for proxy-issued keys (70c72aa)
- sdk/go: expose response metadata on successful calls (eecafec)
- sdk/go: retain allowlisted headers on status errors (af68d8e)
π LibFMP 1.3.2
π LibFMP 1.3.1
π LibFMP 1.3.0
1.3.0 (2026-10-02)
β BREAKING CHANGES
- congressional: CongressionalMemberNetWorthAggregate.cash_and_cash_equivalents and mutual_funds_and_etfs are now optional (Option / pointer / Optional); handle None. New typed columns (pension_and_retirement_assets, other_amount for wire Other, other_assets, salary_and_wages, trusts, government_securities) and an additional_columns map are added.
π Features
πͺ² Bug Fixes
- congressional: decode empty incomeRange as none (7a473c2), closes #400
- congressional: make aggregate cash and mutual funds optional (5a06df5), closes #407 #407
- crates: give CSV bulk calls a longer default timeout (2e3c135)
- docs: document bulk call deadline to prevent mid-body timeouts (0acacef), closes #404
- sdk/go: add separate bulk timeout for CSV calls (3b5f4c6)
π LibFMP 1.2.0
1.2.0 (2026-10-02)
β BREAKING CHANGES
-
company: CompanyProfile.isin, country, change and change_percentage are now optional in Rust, Python and Go, affecting both company.profile and bulk company_profiles.
-
bulk: every numeric member of BulkCashFlowStatement, BulkCashFlowStatementGrowth and BulkEodBar is now optional in Rust, Python and Go.
-
bulk: every numeric member of BulkBalanceSheetStatement and BulkBalanceSheetStatementGrowth is now optional in Rust, Python and Go.
-
bulk: every numeric member of BulkIncomeStatement and BulkIncomeStatementGrowth is now optional in Rust, Python and Go.
-
bulk: every numeric member of BulkKeyMetricsTtm, BulkFinancialRatiosTtm and BulkEarningsSurprise is now optional in Rust, Python and Go.
-
bulk: discounted_cash_flow_score, return_on_equity_score,
return_on_assets_score, debt_to_equity_score, price_to_earnings_score,
price_to_book_score, dcf, stock_price, reported_currency, altman_z_score,
piotroski_score, working_capital, total_assets, retained_earnings, ebit,
market_cap, total_liabilities, revenue, last_month_count,
last_month_avg_price_target, last_quarter_count,
last_quarter_avg_price_target, last_year_count, last_year_avg_price_target,
all_time_count, all_time_avg_price_target, shares_number, asset,
weight_percentage, isin, market_value, strong_buy, buy, hold, sell and
strong_sell are now Option (asset Option, isin
Option, reported_currency Option) in Rust,
Optional[str] in Python and *string in Go. -
bulk: the income-statement-bulk, income-statement-growth-bulk, balance-sheet-statement-bulk, balance-sheet-statement-growth-bulk, cash-flow-statement-bulk, cash-flow-statement-growth-bulk, and eod-bulk methods now require a text/csv response.
-
bulk: the four bulk methods KeyMetricsTTM, FinancialRatiosTTM, StockPeers, and EarningsSurprises now require a text/csv response and no longer decode JSON.
-
bulk: the seven snapshot bulk methods now require a text/csv response; BulkEtfHolding.last_updated_raw is renamed to last_updated and typed as Date in Rust, Python and Go.
-
responses: CongressionalMemberNetWorth and CongressionalMemberNetWorthAggregate no longer derive Eq (their f64 amounts); compare fields instead.
-
responses: CongressionalMemberNetWorth.value and the
CongressionalMemberNetWorthAggregate amounts changed from i64 to f64
(MarketValue). CongressionalMemberNetWorth.category, name, owner and value,
CongressionalNetWorthRange.max, CongressionalDebtDetails.date_incurred and
CongressionalMemberNetWorthAggregate.real_estate, stock,
real_estate_liabilities, business_and_self_employment, ownership_interest,
options, revolving_and_credit_lines, asset_backed_securities and
business_liabilities are now optional (Option / pointer / Optional); handle
None. -
funds: FundDisclosureSearchResult.entity_org_type is now optional
(Option / *string / Optional[str]); the provider's "NULL"
text and null decode as None, so handle None. -
libfmp: a 200 response whose body is an FMP error message (a short plain-text line such as Invalid name, or a JSON object whose only member is "Error Message") now fails with ErrorCategory::Status and status_code Some(200) instead of ErrorCategory::Decode; Python raises FmpStatusError instead of FmpDecodeError. Match on the Status category to handle it.
-
sdk/go: a 200 response whose body is an FMP error message (a short plain-text line such as Invalid name, or a JSON object whose only member is "Error Message") now fails with CategoryStatus and Status 200 instead of CategoryDecode. Match on CategoryStatus to handle it.
-
indexes: IndexConstituent.founded is now String (Rust) / string
(Go) / str (Python) holding the founding year(s) verbatim, e.g. "1994" or
"1902/1985"; it was a Date. Compare or parse the string instead of a date. -
calendar: IpoProspectus.ipo_date is now DateOrYear in Rust (match Date or Year, or use as_date/as_year), datetime.date | int in Python (a bare year is an int), and fmp.DateOrYear in Go (use .Date() / .Year()).
-
responses: CrowdfundingOffering, RegulationDOffering, SecCompanyProfile and SecCompanySearchResult members FMP can omit are now optional (Option / pointer / Optional); handle None.
-
crypto: CryptocurrencyListing members FMP can omit are now optional (Option / pointer / Optional); handle None.
-
responses: NewsArticle, ExchangeHoliday, EsgDisclosure, EsgRating and CongressionalMemberProfile members FMP can omit are now optional (Option / pointer / Optional); handle None.
-
statements: IncomeStatement, KeyMetrics, KeyMetricsTtm, FinancialScore, AsReportedFinancialStatement and FinancialEstimate members FMP can omit are now optional (Option / pointer / Optional); handle None.
-
directory: AvailableExchange, FinancialStatementSymbol and HistoricalIndexConstituent members FMP can omit are now optional, and "" on their typed codes decodes as None (Option / pointer / Optional); handle None.
-
insider-trading: InsiderTrade, BeneficialOwnershipAcquisition, InstitutionalHolding and HolderIndustryBreakdown members FMP can omit are now optional (Option / pointer / Optional); handle None.
-
funds: EtfFundHolding, FundDisclosure and FundDisclosureSearchResult
members FMP can omit are now optional (Option / pointer / Optional); handle
None. -
calendar: DividendEvent, EarningsEvent, IpoCalendarEvent, IpoProspectus and StockSplitEvent members FMP can omit are now optional (Option / pointer / Optional); handle None.
-
search: ExchangeVariant and CompanyScreenerResult members FMP
can omit are now optional (Option / pointer / Optional); handle None. -
statements: 57 BalanceSheetStatement and CashFlowStatement amounts
are now optional (Option / pointer / Optional); callers must handle None. -
economics: TreasuryRate tenors, EconomicIndicatorObservation.value
and six EconomicCalendarEvent members are now optional (Option / pointer
/ Optional); handle None. -
quote: QuoteShort price, change and volume and AftermarketTrade.tradeSize are now optional (Option / pointer / Optional); callers must handle None.
-
company: CompanyProfile, CompanyExecutive, CompanyMarketCapitalization, CompanyNote, CompanyShareFloat, ShareFloat, ExecutiveCompensation and MergerAcquisition members FMP can omit are now optional (Option / pointer / Optional); handle None.
-
statements: financial_reports_json now returns a single
FinancialReportJson instead of a list; drop the [0] / iteration. -
responses: cover null aggregate fields decoding as None (351281b)
π Features
- calendar: make omittable calendar members optional (fefb037)
- codecs: add DateOrYear for date-or-year wire fields (0d2bac5)
- codecs: add empty_or_null deserializer for nullable typed codes (98a10f9), closes #368
- company: make provider-omittable company members optional (370d0b4)
- crates: support single-model endpoints in generators (3673318)
- crypto: make omittable CryptocurrencyListing members optional (f69fdef)
- directory: make omittable directory and index members optional (eefaaf8)
- economics: make treasury tenors and calendar figures optional (b3a7969), closes #368 #368
- fmp-py-gen: use ClientHandle for namespace clients (8b6baf1)
- fmp-py: add close and context manager support to FmpClient (43e3944)
- funds: make omittable fund members optional (64eab5b)
- gen-go: add empty_or_null string codec for Go models (0bb05b0)
- go-sdk: add CloseIdleConnections to release the owned pool (85651e9), closes #371
- insider-trading: make FMP-omittable members optional (9c96061)
- quote: make QuoteShort and AftermarketTrade fields optional (716455c)
- responses: make omittable fundraising and sec filings members optional (4850095)
- responses: make omittable news, market hours, esg and congressional members optional (9ce3a15)
- sdk/go: add DateOrYear temporal type (d9de466)
- search: make...
π LibFMP 1.1.0
1.1.0 (2026-09-29)
π Features
- fmp-py: expose decode_path and decode_kind on FmpError (f3e7460), closes #366
- libfmp/artifact: add null-beta screener fixture (44b7c18)
- libfmp: expose decode path and kind on JSON decode failures (97d1abd)
- sdk/go: name JSON pointer and DecodeKind of decode failures (6a43571)
β¨οΈ CI, Workflows & Configs
πͺ² Bug Fixes
π LibFMP 1.0.0
π LibFMP 0.12.0
0.12.0 (2026-09-25)
β BREAKING CHANGES
- fmp-py: type checkers now reject non-canonical spellings (for example period="quarterly") for closed string arguments.
- fmp-py-gen: constructors take int or float for JSON-number fields instead of JSON text.
- fmp-py-gen: model constructors are keyword-only, rows compare by value and are no longer hashable (cannot be set members or dict keys).
- fmp-py-gen: Go identifiers spell Uid as UID (TipRanksExpertUid.ExpertUid -> ExpertUID, WithExpertUid -> WithExpertUID, ExpertUid() -> ExpertUID()).
- fmp-py-gen: namespaces Esg -> ESG and Tipranks -> TipRanks;
IposCalendar -> IPOCalendar, IpoDate -> IPODate, Sp500Constituents ->
SP500Constituents, Cusip -> CUSIP, Isin -> ISIN, EsgRating -> ESGRating. - fmp-py-gen: namespaces SecFilings -> SECFilings and Dcf -> DCF, and
identifiers such as Latest8k -> Latest8K, Form13fFilingDate ->
Form13FFilingDate, CotReport -> COTReport, and DcfValuation ->
DCFValuation. - fmp-py-gen: Go identifiers spell Etf as ETF, Etfs as ETFs, Ttm as TTM,
and Eps as EPS (for example Quote.Etfs -> Quote.ETFs, EtfHolding ->
ETFHolding, KeyMetricsTtm -> KeyMetricsTTM, EpsActual -> EPSActual). - fmp-py-gen: Go identifiers spell Cik as CIK and Id as ID (for
example ByCik -> ByCIK, CikListing -> CIKListing, MemberId -> MemberID,
NewCikSearchQuery -> NewCIKSearchQuery).
Issue: 344
- fmp-py-gen: Go names change with the initialism table. UsDate ->
USDate, NewUsDate -> NewUSDate, ParseUsDate -> ParseUSDate,
GeographyUsOnly -> GeographyUSOnly,
EconomicIndicatorSmoothedUsRecessionProbabilities ->
EconomicIndicatorSmoothedUSRecessionProbabilities, LinkJson -> LinkJSON,
FinancialReportJson -> FinancialReportJSON, FinancialReportsJsonQuery ->
FinancialReportsJSONQuery, Reports.Json -> Reports.JSON, and Url struct
fields (IpoDisclosure, IpoProspectus, EsgDisclosure, InsiderTrade,
BeneficialOwnershipAcquisition, NewsArticle, SecFilingsUrl,
TipRanks results) -> URL. - sdk: Rust Client::fmp_articles/fmp_articles()/FmpArticlesQuery/FmpArticle -> articles/ArticlesQuery/Article; Python news.fmp_articles/FmpArticle -> news.articles/Article; Go News.FmpArticles/FmpArticlesQuery/FmpArticle -> News.Articles/ArticlesQuery/Article.
- sdk/go: FmpHeader is now FMPHeader, FmpQuery is now FMPQuery,
FmpHeaderFromEnv is now FMPHeaderFromEnv, and FmpAPIKeyFromEnv is now
APIKeyFromEnv. - libfmp: Rust only: the beta fields are types::Ratio and the dividend and DCF per-share fields are types::PerShareAmount instead of types::MarketValue (all remain f64).
- libfmp: row types renamed in every SDK: BulkStockPeers -> BulkStockPeer, CikEntry -> CikListing, CompanyScreenerEntry -> CompanyScreenerResult, CongressionalMemberNetWorthEntry -> CongressionalMemberNetWorth. Refs #343.
- sdk: Python statements.growth.income_statement -> growth.income, growth.balance_sheet_statement -> growth.balance_sheet, growth.cash_flow_statement -> growth.cash_flow, growth.financial_statement -> growth.financial (Go: Statements.Growth.Income, .BalanceSheet, .CashFlow, .Financial); Rust Client methods unchanged. Refs #343.
- sdk: Python dcf.discounted_cash_flow -> dcf.standard, dcf.levered_discounted_cash_flow -> dcf.levered, dcf.custom_discounted_cash_flow -> dcf.custom, dcf.custom_levered_discounted_cash_flow -> dcf.custom_levered (Go: Dcf.Standard, Dcf.Levered, Dcf.Custom, Dcf.CustomLevered); Rust Client methods unchanged. Refs #343.
- sdk: Python transcripts.latest_earnings_transcripts -> transcripts.latest, transcripts.earnings_transcript -> transcripts.by_quarter, transcripts.earnings_transcript_dates -> transcripts.dates, market_hours.exchange_market_hours -> market_hours.exchange, market_hours.all_exchange_market_hours -> market_hours.all_exchanges, market_hours.holidays_by_exchange -> market_hours.holidays (Go: same names in UpperCamelCase); Rust Client methods unchanged. Refs #343.
- sdk: Python funds.fund_disclosures -> funds.disclosures, funds.fund_disclosure_dates -> funds.disclosure_dates, funds.latest_fund_disclosure_holders -> funds.latest_disclosure_holders, funds.search_fund_disclosure_holders -> funds.search_disclosure_holders (Go: Funds.Disclosures, Funds.DisclosureDates, Funds.LatestDisclosureHolders, Funds.SearchDisclosureHolders); Rust Client methods unchanged. Refs #343.
- libfmp: Rust Client::tipranks_ratings_search is now search_tipranks_ratings; Python tipranks.ratings_search is tipranks.search_ratings; Go Tipranks.RatingsSearch is Tipranks.SearchRatings. Refs #343.
- libfmp: company renames in every SDK: market_capitalization_batch -> batch_market_capitalization, shares_float_all -> all_shares_float, mergers_acquisitions_latest -> latest_mergers_acquisitions, mergers_acquisitions_search -> search_mergers_acquisitions (with matching query types), MarketCapitalizationRecord -> CompanyMarketCapitalization, AllSharesFloatRecord -> ShareFloat. Refs #343.
- sdk: quote.batch_quote is now quote.batch and quote.batch_quote_short is quote.batch_short in Python (Go: Quote.Batch, Quote.BatchShort); Rust Client methods unchanged.
- libfmp: every public response struct (incl. technical-indicator rows) is #[non_exhaustive]; downstream code can no longer build them with struct literals or exhaustive destructuring, deserialize JSON instead.
- libfmp: StatementAmount is now f64 (float64 in Go, float in Python) on all 276 response fields; values above 2^53 round.
- libfmp: the listed money and quantity fields are now f64, and InstitutionalHolding and InstitutionalIndustrySummary no longer derive Eq.
- libfmp: the following fields are now f64. As Quantity:
floatShares and outstandingShares on the float records,
numberOfSecurityOffered on crowdfunding offerings,
dilutedSharesOutstanding on DCF valuations, weightedAverageShsOut and
weightedAverageShsOutDil on income statements, numberOfShares on
summaries, and tradeSize, bidSize and askSize on aftermarket quotes and
trades. As MarketValue: salary, bonus, stockAward, optionAward,
incentivePlanCompensation, allOtherCompensation and total on executive
compensation, minimumInvestmentAccepted, totalOfferingAmount,
totalAmountSold, totalAmountRemaining, salesCommissions, findersFees and
grossProceedsUsed on Regulation D offerings, and revenueActual and
revenueEstimated on earnings calendar events. ExecutiveCompensation,
CrowdfundingOffering and RegulationDOffering no longer derive Eq. - libfmp: insider securities_owned/securities_transacted/total_acquired/total_disposed and funds shares_number/shares/change/balance are f64 (Quantity); ETF assets_under_management is f64 (MarketValue).
- libfmp: MarketCapitalization is f64; crypto circulating_supply/total_supply and stock split numerator/denominator are f64; the affected response structs no longer derive Eq; the screener market-cap filters take u64.
- libfmp:
libfmp::codecs::volumeis removed; the serializer is crate-private ascodecs::integral_f64. - fmp-py: fmp._native no longer exposes the _Fmp* exception aliases and fmp.QuoteShort is removed; import QuoteShort from fmp.quote.
- fmp-py: FmpClient raises FmpConfigError for non-str headers and out-of-range max_response_body_bytes; internal runtime failures raise FmpError rather than FmpConfigError.
- sdk/go: WithDangerAllowInsecureAuthentication takes no argument; replace WithDangerAllowInsecureAuthentication(true) with WithDangerAllowInsecureAuthentication() and drop any (false) call
- sdk/go: CustomQuery names outside ASCII letters, digits and -._~ are now rejected by NewClient with ConfigurationKindInvalidQueryName
- libfmp: TLS now comes from the default rustls cargo feature,
default-features = false drops TLS. - libfmp: the
ExecutorErrorunit literal is no longer constructible downstream; useExecutorError::new.StringValueErrorandSecretNameErrorare now#[non_exhaustive], and the codec with-helper modules are#[doc(hidden)]and exempt from semver guarantees.
π Features
- fmp-py-gen: add match_args, field-listing repr, and to_dict to models (3309195)
- fmp-py-gen: keyword-only models with value equality (1d17f51)
- fmp-py-gen: type closed enum model fields as Literal (b618788)
- fmp-py-gen: type JSON number fields as int or float (5065270)
- fmp-py: type closed string arguments as Literal and headers as Mapping (3bd2ab7)
- libfmp: make TLS a toggleable rustls cargo feature (c805153)
- libfmp: mark public response structs non_exhaustive (c8107d6), closes #342 #342
- libfmp: re-export core dependencies and assert client bounds (64a250e), closes #346
- sdk/go/artifact: add EndpointMetadataByID (60392f4)
βοΈ Enhancement & Maintenance
- fmp-py-gen: add the Go initialism table to gen_go (078ef5b)
- fmp-py-gen: spell CIK and ID in Go names ([...