Skip to content

Releases

πŸ“ˆ LibFMP 1.5.0

Choose a tag to compare

@ptah-bw-technical-app ptah-bw-technical-app released this 11 Oct 22:30

1.5.0 (2026-10-11)

🎁 Features

  • fmp-py-gen: generate async namespaces alongside sync twins (325b2b0)
  • fmp-py: add AsyncFmpClient with coroutine-based endpoints (afd205f)

πŸ“ˆ LibFMP 1.4.0

Choose a tag to compare

@ptah-bw-technical-app ptah-bw-technical-app released this 06 Oct 11:44

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

Choose a tag to compare

@ptah-bw-technical-app ptah-bw-technical-app released this 04 Oct 10:17

1.3.2 (2026-10-04)

♨️ CI, Workflows & Configs

  • fmp-py: ignore uv.lock in examples folder (3b60455)
  • go-sdk: exclude example dirs from workflow path triggers (297c548)
  • go-sdk: report go sdk checks on every pull request (8bd603e)

πŸͺ² Bug Fixes

  • client: accept xlsx bodies labeled as json via zip magic sniff (e31e10b), closes #411
  • sdk/go: accept xlsx bodies FMP labels as JSON (ad2ab5b), closes #411

πŸ“ˆ LibFMP 1.3.1

Choose a tag to compare

@ptah-bw-technical-app ptah-bw-technical-app released this 03 Oct 13:32

1.3.1 (2026-10-03)

πŸͺ² Bug Fixes

  • fmp-py: type DynamicObject getters as dict[str, Any] in stubs (45d609a), closes #409

πŸ“ˆ LibFMP 1.3.0

Choose a tag to compare

@ptah-bw-technical-app ptah-bw-technical-app released this 02 Oct 16:38

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

  • crates: add empty-or-null nested-object codec (1fd32f5), closes #400

πŸͺ² 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

Choose a tag to compare

@ptah-bw-technical-app ptah-bw-technical-app released this 02 Oct 02:04

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...
Read more

πŸ“ˆ LibFMP 1.1.0

Choose a tag to compare

@ptah-bw-technical-app ptah-bw-technical-app released this 29 Sep 10:12

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

  • gitignore: add requests to ignored paths (#365) (7785aff)

πŸͺ² Bug Fixes

  • decode: expose decode path and kind for invalid member values (fd590e5)
  • fmp-py-gen: teach gen_go the count codec for #367 (8e8b6a6)
  • libfmp: guard Count decoding against fractional floats (739eca8), closes #367
  • sdk/go/artifact: accept integral floats in Count response fields (f295a23), closes #367

πŸ“ˆ LibFMP 1.0.0

Choose a tag to compare

@ptah-bw-technical-app ptah-bw-technical-app released this 26 Sep 02:11

1.0.0 (2026-09-26)

⚑ Breaking Changes

  • release: publish new major version [skip ci] (fd11b57)

βš’οΈ Enhancement & Maintenance

  • workflows: point reusable workflow refs to reusable-workflows (#364) (8dd574c)

♨️ CI, Workflows & Configs

  • crates: mark fmp-py as production/stable (c37206c)
  • github: install mypy in pre-commit workflow venv (f07006a)

πŸ“ˆ LibFMP 0.12.0

Choose a tag to compare

@ptah-bw-technical-app ptah-bw-technical-app released this 25 Sep 13:41

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::volume is removed; the serializer is crate-private as codecs::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 ExecutorError unit literal is no longer constructible downstream; use ExecutorError::new. StringValueError and SecretNameError are 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 ([...
Read more

πŸ“ˆ LibFMP 0.11.0

Choose a tag to compare

@ptah-bw-technical-app ptah-bw-technical-app released this 24 Sep 07:05

0.11.0 (2026-09-24)

⚠ BREAKING CHANGES

  • libfmp: Volume is f64

βš’οΈ Enhancement & Maintenance

  • fmp-py-gen: drop dead serialize_with field attr handling (74e1dcf)

πŸͺ² Bug Fixes

  • libfmp: decode fractional volume as f64 (f31adea), closes #337 #337
  • libfmp: emit i64::MIN as an integer at the -2^63 bound (461dd9d)