﻿{"version":"v1","contact":"data.info@csimarket.com","note":"All changes are additive unless marked [breaking]. Field names and response structures are stable within a major version. New fields may be added to existing endpoints without a version bump.","policy":{"deprecation_notice":"Minimum 90 days notice before any field removal or rename.","breaking_changes":"Breaking changes require a new major version (\/api\/v2\/*).","additions":"New fields and endpoints are non-breaking and may be added at any time.","null_fields":"Fields may return null when data is unavailable. Never omitted entirely."},"changelog":[{"version":"1.20.0","date":"2026-07-30","type":"breaking","summary":"License plan model reindexed: 5 tiers -> 3 (Individual\/Professional\/Enterprise)","description":"product_plan moves from a 5-value scheme (0=Basic, 1=Standard, 2=Premium, 3=Institutional, 4=Enterprise) to a 3-value scheme (0=Individual, 1=Professional, 2=Enterprise), returned as-is in GET \/api\/v1\/license\/status. Every tier now carries the full fundamentals + quant + stocks scope set; bulk.read (bulk\/export access) is granted to Professional and Enterprise only. Existing licenses previously on plan 3 (Institutional) were migrated to plan 1 (Professional), same rate limit (300\/min) and bulk access as before, under the new plan number. Professional additionally introduces a location lock (enforce_ip): the license's first authenticated request auto-captures the caller's IP as its allowed range going forward.","breaking":true},{"version":"1.19.0","date":"2026-07-21","type":"feature","summary":"Free-tier sample endpoints now return up to 8 periods (~2 years of TTM), was 1","description":"The keyless free-evaluation endpoints at \/api\/test\/industries\/201\/{growth|profitability|valuation|financial-strength|efficiency|management-effectiveness|dashboard} now return the 8 most-recent periods per analytic (newest-first) instead of a single latest period. The newest TTM period is only ~2% into its reporting cycle (metrics still mostly null), so the previous single-period sample surfaced mostly nulls; returning ~2 years of TTM history gives evaluators fully populated data. The row cap is now one config value (config\/api.php => sample_period_limit, default 8), applied to every sample endpoint and period type (TTM\/Q\/FY) and reported as meta.period_limit (=8) in every sample response. meta.sample stays true; auth, scopes and the exposed industry (201) are unchanged. The consolidated bundle at GET \/api\/industry-sample reflects the same cap.","breaking":false},{"version":"1.18.0","date":"2026-07-09","type":"feature","summary":"OData full-surface mirror: 18 test + 41 v1 entity sets matching \/api\/v1\/ exactly","description":"Both OData tiers now mirror the full \/api\/v1\/ REST surface. Test tier (free): 18 entity sets: Industries_List\/Overview\/6 analytics\/Dashboard + Sectors same. V1 tier (licensed): 41 entity sets covering all industry, sector, and company analytics, Companies_PerShare, Scores, Zscores, QuantProfile, Signals (all cross-sectional from company_fundamental_ratios), all 4 Companies_MarketStructure_* entries, 3 statement sets, Companies_QuantFactors, QuantFactors_Screener. Market-structure and quant-factors sets are declared in EDMX but redirect to REST via @odata.note. Test tier entity set names changed: IndustryGrowth \u2192 Industries_Growth etc.","breaking":["test tier: entity set names changed (e.g. IndustryGrowth \u2192 Industries_Growth, SectorGrowth \u2192 Sectors_Growth)"],"migration":"Update \/api\/odata\/test\/ callers to new plural names. V1 names from 1.17.0 unchanged. QuantFactors \u2192 Companies_QuantFactors; MarketStructure_Technical \u2192 Companies_MarketStructure_Technical; MarketStructure_Advanced \u2192 Companies_MarketStructure_Advanced."},{"version":"1.17.0","date":"2026-07-09","type":"feature","summary":"OData v1 entity set expansion: 24 sets mirroring \/api\/v1\/ + FieldRegistry EDMX","description":"The gated OData v1 tier (\/api\/odata\/v1\/) now exposes 24 entity sets that mirror \/api\/v1\/ path segments exactly (plural, underscore-separated). Industries_Growth through Industries_ManagementEffectiveness (6 sets), Sectors_Growth through Sectors_ManagementEffectiveness (6 sets): cross-sectional industry\/sector data. Companies_Growth through Companies_ManagementEffectiveness (6 sets): cross-sectional data from company_fundamental_ratios; supports $filter=ticker eq 'AAPL' to scope to one company. Companies_IncomeStatements, Companies_BalanceSheets, Companies_CashFlow (3 sets): declared in service document + EDMX; require $filter=ticker eq 'AAPL'. QuantFactors, MarketStructure_Technical, MarketStructure_Advanced (3 sets): declared in service document + EDMX; use $filter=ticker eq 'AAPL' or the REST screener. V1 $metadata EDMX is now generated from FieldRegistry field definitions, keeping property types and names automatically in sync with \/api\/meta, \/api\/fields, and \/api\/schema. The test tier (\/api\/odata\/test\/) is unchanged: 12 entity sets, existing names, existing EDMX.","entity_sets_v1":["Industries_Growth","Industries_Profitability","Industries_Valuation","Industries_FinancialStrength","Industries_Efficiency","Industries_ManagementEffectiveness","Sectors_Growth","Sectors_Profitability","Sectors_Valuation","Sectors_FinancialStrength","Sectors_Efficiency","Sectors_ManagementEffectiveness","Companies_Growth","Companies_Profitability","Companies_Valuation","Companies_FinancialStrength","Companies_Efficiency","Companies_ManagementEffectiveness","Companies_IncomeStatements","Companies_BalanceSheets","Companies_CashFlow","QuantFactors","MarketStructure_Technical","MarketStructure_Advanced"],"breaking":false,"migration":"Existing callers of \/api\/odata\/v1\/{entity} using old names (IndustryGrowth, SectorGrowth) should update to the new plural names (Industries_Growth, Sectors_Growth). The test tier entity set names are unchanged."},{"version":"1.16.0","date":"2026-07-09","type":"feature","summary":"OData 4.0 two-tier split (test\/v1) + IEEE754 decimal fix","description":"The OData 4.0 service is now split into two tiers matching the REST API structure. GET \/api\/odata\/test\/: free, no API key, 12 industry + sector entity sets. Paste into Excel \"From OData Feed\" with no credentials. GET \/api\/odata\/v1\/: gated, requires X-API-Key (same ValidateLicense middleware as \/api\/v1\/*). Same 12 entity sets for now; company\/quant entity sets will be added here as they are built. Each tier has its own $metadata EDMX and entity set list. Also fixes IEEE754Compatible=true type conflict: all Edm.Decimal values are now always returned as JSON strings (e.g. \"15.5\" not 15.5) so the Excel OData connector accepts them without a type error. The EDMX declares each field as Edm.Decimal so Excel casts back to number correctly. Backward-compat unversioned \/api\/odata\/ routes are preserved and delegate to the test tier.","endpoints_added":["GET \/api\/odata\/test\/","GET \/api\/odata\/test\/$metadata","GET \/api\/odata\/test\/{entity}","GET \/api\/odata\/v1\/","GET \/api\/odata\/v1\/$metadata","GET \/api\/odata\/v1\/{entity}"],"breaking":false,"migration":"Existing \/api\/odata\/{entity} callers are unaffected (unversioned routes still work). Update Excel OData Feed URL to \/api\/odata\/test\/ (free) or \/api\/odata\/v1\/ (licensed) for tier-specific service documents."},{"version":"1.15.0","date":"2026-07-09","type":"feature","summary":"Proper OData 4.0 service at \/api\/odata\/ (Excel-ready)","description":"A full OData 4.0 service is now available at GET \/api\/odata\/. It exposes 12 entity sets (6 industry analytics + 6 sector analytics) backed by ind_fundamentals_ratio. Three endpoints: (1) GET \/api\/odata\/: service document listing all entity sets; (2) GET \/api\/odata\/$metadata: programmatically generated EDMX XML with EntityType definitions, property types (Edm.String\/Edm.Int32\/Edm.Decimal), and EntityContainer; (3) GET \/api\/odata\/{entity}: data endpoint with OData query options: $filter (field eq\/ne\/gt\/lt\/ge\/le value, and-chained), $select (comma-separated field list, applied post-query), $top (default 100, max 500), $orderby (field asc|desc). Every row carries industry_id\/sector_id as the entity key, period_label, and all analytic columns for the entity set. Public: no API key required. Paste \/api\/odata\/ into Excel \"Data \u2192 Get Data \u2192 From OData Feed\" for a live connection. Also: ?format=odata removed from the per-endpoint middleware (it was not a valid OData service, no $metadata, rejected by Excel). The middleware now supports ?format=csv only; use \/api\/odata\/ for Excel.","endpoints_added":["GET \/api\/odata\/","GET \/api\/odata\/$metadata","GET \/api\/odata\/IndustryGrowth","GET \/api\/odata\/IndustryProfitability","GET \/api\/odata\/IndustryValuation","GET \/api\/odata\/IndustryFinancialStrength","GET \/api\/odata\/IndustryEfficiency","GET \/api\/odata\/IndustryManagementEffectiveness","GET \/api\/odata\/SectorGrowth","GET \/api\/odata\/SectorProfitability","GET \/api\/odata\/SectorValuation","GET \/api\/odata\/SectorFinancialStrength","GET \/api\/odata\/SectorEfficiency","GET \/api\/odata\/SectorManagementEffectiveness"],"parameters_removed":["?format=odata: removed from per-endpoint middleware (was a non-standard envelope, not a valid OData 4.0 service)"],"breaking":false,"migration":"Replace ?format=odata calls with the \/api\/odata\/{entity} endpoints. The OData service is richer: full $metadata, $filter, $select, $top, $orderby, and Excel-compatible."},{"version":"1.14.0","date":"2026-07-09","type":"feature","summary":"Response format negotiation: ?format=odata and ?format=csv on all endpoints","description":"A single global middleware (FormatResponseMiddleware) now intercepts ?format= on every JSON-returning endpoint, no per-controller changes. ?format=odata rewraps the response as an OData v4 envelope ({@odata.context, @odata.count, @meta, value:[...]}) with Content-Type application\/json;odata.metadata=minimal, enabling Excel \"Get Data \u2192 From OData Feed\" with zero configuration. ?format=csv streams a UTF-8 CSV download: header row from the first data row's field names, filename derived from the request path (e.g. industries-201-growth.csv), null values as empty cells, numbers unquoted unless they contain commas. ?format=csv is not supported on \/dashboard endpoints (returns 400 with guidance to use a single-analytic endpoint instead); ?format=odata is supported on all endpoints including dashboard. A free keyless evaluation suite is also added at \/api\/test\/industries\/201\/{endpoint} (all 8 industry endpoints, period caps TTM=1\/Q=5\/FY=2, 60 req\/min); the consolidated bundle at GET \/api\/industry-sample remains available.","parameters_added":["?format=odata: all JSON endpoints (industries, sectors, companies, quant-factors, screener, statements, bulk, license, metadata)","?format=csv: all single-section endpoints; \/dashboard returns 400 with guidance"],"endpoints_added":["GET \/api\/test\/industries\/201","GET \/api\/test\/industries\/201\/growth","GET \/api\/test\/industries\/201\/profitability","GET \/api\/test\/industries\/201\/valuation","GET \/api\/test\/industries\/201\/financial-strength","GET \/api\/test\/industries\/201\/efficiency","GET \/api\/test\/industries\/201\/management-effectiveness","GET \/api\/test\/industries\/201\/dashboard"],"breaking":false},{"version":"1.13.0","date":"2026-06-25","type":"feature","summary":"Quant-factors cross-sectional screener","description":"New gated endpoint GET \/api\/v1\/quant-factors\/screener: screen the quant-factors universe for one period (period_type=D live snapshot, default; or Q with tm=YYYYPP). Numeric range filters (<field>_min \/ <field>_max) and exact filters (<field>=value) over a whitelisted field set (listed at \/api\/schema\/quant_factors, screener block); whitelisted sort\/order, capped pagination (limit default 50, max 200, offset). Fail-loud: an unknown filter param or a non-numeric value on a numeric filter returns 400, a mistyped filter never silently returns the unfiltered universe. By default returns the live universe (is_active_company=1 fresh price within ~5 trading days, is_operating_company=1, is_price_reliable=1); include_inactive=1 \/ include_unreliable=1 relax that. Each row carries the same fields + held block as the single-cik endpoint.","endpoints_added":["GET \/api\/v1\/quant-factors\/screener"],"breaking":false},{"version":"1.12.0","date":"2026-06-25","type":"feature","summary":"Quant Factors & Risk endpoint launched","description":"New gated endpoint GET \/api\/v1\/companies\/{cik}\/quant-factors over the daily market-structure model: style factor exposures (size\/value\/quality\/growth\/momentum\/low-vol\/liquidity), a composite factor score with cross-sectional percentile rank, factor z-scores, percentile-ranked risk scores (tail\/stress\/crash\/trend\/concentration), market structure (cap weight, ranks), betas\/alphas vs US-500\/Tech\/Nasdaq\/Small-2000 benchmarks, index membership, institutional\/insider\/short-interest ownership, liquidity, technicals, and regime labels. period_type D = live daily snapshot (default) or Q = quarterly history (2013 Q1 onward; ?tm=YYYYPP for a single quarter, PP in {00,25,50,75}). Every advertised field is always present (null where unavailable). Rows the pricing model flags as unreliable return the affected fields as null with a per-row \"held\" object stating the reason (dual_class_basis_pending, price_magnitude_implausible, return_discontinuity), a garbage value is never served. A new percentile unit (0-100 cross-sectional rank, not a probability) is documented in the value scale. Registered across the public metadata layer (\/api\/discovery, \/api\/datasets, \/api\/schema\/quant_factors, \/api\/meta\/quant_factors, \/api\/fields, \/api\/openapi.json).","endpoints_added":["GET \/api\/v1\/companies\/{cik}\/quant-factors"],"breaking":false},{"version":"1.11.1","date":"2026-06-13","type":"fix","summary":"Industry & sector \/dashboard endpoints restored (growth sub-key 500)","description":"The industry and sector \/dashboard endpoints returned a 500 for all entities because their combined query omitted several growth columns that the growth sub-key reads, the free_cash_flow \/ capex \/ eps reported-counts and the sequential (quarter-over-quarter) beat\/miss percentages, surfacing first as free_cash_flow_reported_count. The dashboard queries now fetch all of them, so \/dashboard returns the full growth section exactly like the standalone \/growth endpoint. Defensive null-coalescing was also added to the growth field mapper so a future column omission degrades to null instead of a 500. Values only; no field renames or shape changes.","breaking":false},{"version":"1.11.0","date":"2026-06-13","type":"data-quality","summary":"Inventory-derived efficiency ratios now null at financial-sector aggregates","description":"At financial-sector industry and sector aggregates (banks, insurers, REITs), the inventory-derived efficiency ratios are now returned as null rather than a computed value. The inventory reported at these aggregates is real but belongs to a few diversified conglomerate-insurers (e.g. Berkshire Hathaway in P&C, Cigna \/ Express Scripts in A&H), which makes the derived turnover \/ days \/ cycle ratios structurally meaningless for the sector as a whole. This applies uniformly across all classification systems (CSIMarket sector 700 and industries 701-799, NAICS 52xx plus 5311, SIC 6000-6799, ISIC 64\/65\/66\/68), on the efficiency and dashboard endpoints and in the industries\/sectors bulk exports. Total-Market and S&P-500 aggregates are never affected. The raw inventory balance-sheet figure itself is unchanged; only these derived ratios are nulled. Non-financial sectors are unaffected.","fields_nulled_for_financials":["inventory_turnover_cogs","days_inventory_outstanding","operating_cycle_days","cash_conversion_cycle","cash_conversion_cycle_median","cash_conversion_cycle_stddev","efficiency_score"],"breaking":false},{"version":"1.10.0","date":"2026-06-10","type":"addition","summary":"New CURRENT period_type for live valuation multiples (valuation only)","description":"Added an opt-in CURRENT period_type to the valuation endpoints: the current\/spot market price divided by the last complete trailing-twelve-month fundamentals (P\/E, P\/S, P\/B, P\/CF, EV\/EBITDA, EV\/Sales). It is a single rolling snapshot per entity (overwritten each cycle, not a historical series). CURRENT is valuation-only; other datasets do not carry it. Additive and non-breaking: the default period_type stays TTM; request it with ?period_type=CURRENT.","breaking":false},{"version":"1.9.0","date":"2026-06-10","type":"breaking","summary":"Valuation field names standardized to the short metric stem","description":"Valuation dispersion and ranking output fields were renamed to one short stem per metric, dropping the redundant _ratio \/ _to_ infixes so every derivative reads off the same stem (pe, ev_ebitda). The underlying DB columns and the ingestion pipeline were migrated to match, and empty unused alias columns were removed. Values are unchanged; only field names changed.","fields_renamed":["pe_ratio_median -> pe_median, pe_ratio_p25 -> pe_p25, pe_ratio_p75 -> pe_p75","pe_ratio_stddev -> pe_stddev, pe_ratio_quartile_spread -> pe_quartile_spread, pe_ratio_mad -> pe_mad","pe_ratio_cross_industry_percentile -> pe_cross_industry_percentile (sectors: pe_cross_sector_percentile)","ev_to_ebitda_median -> ev_ebitda_median, ev_to_ebitda_p25 -> ev_ebitda_p25, ev_to_ebitda_p75 -> ev_ebitda_p75","ev_to_ebitda_stddev -> ev_ebitda_stddev, ev_to_ebitda_quartile_spread -> ev_ebitda_quartile_spread","free_cash_flow_yield -> fcf_yield"],"migration_note":"If you consume the valuation endpoints, update field references to the new names; the old names are no longer returned.","breaking":true},{"version":"1.8.0","date":"2026-06-01","type":"breaking","summary":"Monetary and share-count fields corrected from millions to raw units","description":"All absolute monetary values now return raw USD rather than millions-of-dollars, and share-count fields now return raw share counts rather than millions-of-shares. Affects both ratio tables (company_fundamental_ratios, ind_fundamentals_ratio) and all six financial statement controllers, the bulk and per-company controllers for each of the three statement datasets: income statements, balance sheets, and cash flow statements. Ratios, margins, per-share values, percentiles, and dividends_in_millions are unchanged.","migration_note":"Divide previously returned monetary values by 1,000,000 to reproduce the old scale. Example: Apple annual revenue was ~380,000 (old, millions); it is now ~380,000,000,000 (raw USD). Apply the same divisor to share-count fields.","scaled_fields":["All absolute monetary fields (revenue, net_income, ebitda, assets, debt, cash, \u2026)","Share-count fields: outshares, dilutedavg, basic_shares, diluted_shares"],"fields_unchanged":["All per-share fields (eps_*, *_per_share, fcf_per_share, ocf_per_share)","All ratio and multiple fields (pe, ps, pb, debt_to_equity, interest_coverage, \u2026)","All percentage and margin fields (*_margin, *_yoy, *_seq, effective_tax_rate, \u2026)","All percentile and rank fields (*_percentile, *_rank_*)","dividends_in_millions (explicitly million-denominated by name)"],"breaking":true},{"version":"1.7.1","date":"2026-06-01","type":"fix","summary":"Identifier parity, z-score ETL fix, and income statement controller fix","description":"Three targeted corrections: (1) lei, isin, and cusip global security identifiers now appear on company list\/detail endpoints and all six statement controllers via a new CompanyIdentifiers shared definition, the shared definition provides parity across both the per-company statement endpoints and the bulk dataset endpoints. (2) The z-score ETL --hist argument was a dead no-op, leaving all historical z-score columns unpopulated; corrected. (3) The bulk income statement controller was reading from company_fundamental_ratios instead of the dedicated income statement table; rebuilt against the correct source.","fields_added":["lei: GET \/api\/v1\/companies (inline), GET \/api\/v1\/companies\/{cik} (inline), and meta.identifiers block on all six statement endpoints (per-company: \/companies\/{cik}\/income-statements, \/companies\/{cik}\/balance-sheets, \/companies\/{cik}\/cash-flow-statements; bulk: \/income-statements, \/balance-sheets, \/cash-flow-statements)","isin: same coverage","cusip: same coverage"],"internal_fixes":["ETL: --hist flag now correctly triggers historical z-score column population","BulkIncomeStatementController: rebuilt to read from income statement table, not company_fundamental_ratios"],"breaking":false},{"version":"1.7.0","date":"2026-05-30","type":"feature","summary":"Public metadata layer launched","description":"Added eight public endpoints for API discovery, schema exploration, and coverage verification. No license required.","endpoints_added":["GET \/api\/discovery","GET \/api\/coverage","GET \/api\/schema\/{dataset}","GET \/api\/status","GET \/api\/changelog","GET \/api\/methodology","GET \/api\/openapi.json","GET \/api\/docs"],"breaking":false},{"version":"1.6.0","date":"2026-05-15","type":"feature","summary":"Company scores, z-scores, quant profile, and signals endpoints","description":"Added six new company endpoints covering factor scores, Piotroski\/Beneish\/Altman forensic scores, cross-sectional z-scores, 5-year statistical profiles, and probabilistic signals.","endpoints_added":["GET \/api\/v1\/companies\/{cik}\/scores","GET \/api\/v1\/companies\/{cik}\/zscores","GET \/api\/v1\/companies\/{cik}\/quant-profile","GET \/api\/v1\/companies\/{cik}\/signals","GET \/api\/v1\/companies\/{cik}\/per-share"],"breaking":false},{"version":"1.5.0","date":"2026-04-20","type":"feature","summary":"Cross-industry and cross-sector percentile rankings added to all endpoints","description":"All industry and sector endpoints now include cross-industry\/cross-sector percentile columns for key metrics (revenue_yoy, operating_margin, net_margin, debt_to_equity, interest_coverage, pe_ratio, ev_ebitda, earnings_yield, ev_sales, return_on_equity, return_on_invested_capital).","fields_added":["revenue_yoy_cross_industry_percentile","revenue_3y_cagr_cross_industry_percentile","operating_margin_cross_industry_percentile","net_margin_cross_industry_percentile","debt_to_equity_cross_industry_percentile","interest_coverage_cross_industry_percentile","pe_ratio_cross_industry_percentile","ev_ebitda_cross_industry_percentile","ev_sales_cross_industry_percentile","earnings_yield_cross_industry_percentile","return_on_equity_cross_industry_percentile","...and sector equivalents (_cross_sector_percentile)"],"breaking":false},{"version":"1.4.0","date":"2026-03-10","type":"feature","summary":"Company fundamentals API launched","description":"Full company fundamentals coverage added with growth, profitability, valuation, financial strength, efficiency, management effectiveness, and dashboard endpoints. Supports TTM, FY, and Q period types.","endpoints_added":["GET \/api\/v1\/companies","GET \/api\/v1\/companies\/{cik}","GET \/api\/v1\/companies\/{cik}\/growth","GET \/api\/v1\/companies\/{cik}\/profitability","GET \/api\/v1\/companies\/{cik}\/valuation","GET \/api\/v1\/companies\/{cik}\/financial-strength","GET \/api\/v1\/companies\/{cik}\/efficiency","GET \/api\/v1\/companies\/{cik}\/management-effectiveness","GET \/api\/v1\/companies\/{cik}\/dashboard"],"breaking":false},{"version":"1.3.0","date":"2026-02-01","type":"feature","summary":"Sector API added: mirrors industry API structure","description":"Full sector-level analytics added. Shares the same endpoint pattern and field set as industries, with cross-sector percentile rankings instead of cross-industry.","endpoints_added":["GET \/api\/v1\/sectors","GET \/api\/v1\/sectors\/{id}","GET \/api\/v1\/sectors\/{id}\/growth","GET \/api\/v1\/sectors\/{id}\/profitability","GET \/api\/v1\/sectors\/{id}\/valuation","GET \/api\/v1\/sectors\/{id}\/financial-strength","GET \/api\/v1\/sectors\/{id}\/efficiency","GET \/api\/v1\/sectors\/{id}\/management-effectiveness","GET \/api\/v1\/sectors\/{id}\/dashboard"],"breaking":false},{"version":"1.2.0","date":"2026-01-15","type":"feature","summary":"Dispersion statistics added to industry growth and profitability","description":"Full cross-sectional dispersion statistics added to industry growth and profitability endpoints: median, p10, p25, p75, p90, stddev, IQR, MAD, CV, skewness, kurtosis, downside stddev, HHI concentration, entropy, breadth diffusion index.","fields_added":["revenue_yoy_median","revenue_yoy_p10","revenue_yoy_p25","revenue_yoy_p75","revenue_yoy_p90","revenue_yoy_stddev","revenue_yoy_iqr","revenue_yoy_mad","revenue_yoy_cv","revenue_yoy_skewness","revenue_yoy_kurtosis","revenue_yoy_downside_stddev","revenue_concentration_hhi","profit_concentration_hhi","revenue_dispersion_entropy","earnings_dispersion_entropy","breadth_diffusion_index","earnings_breadth_score","operating_margin_median","operating_margin_stddev","...and full operating margin and net margin dispersion sets"],"breaking":false},{"version":"1.1.0","date":"2025-12-01","type":"feature","summary":"Industry dashboard endpoint and z-score fields added","description":"Dashboard endpoint added returning all six analytical sections in a single request. Z-score fields added across growth, profitability, valuation, financial strength, and management effectiveness.","endpoints_added":["GET \/api\/v1\/industries\/{id}\/dashboard"],"fields_added":["revenue_yoy_zscore","revenue_growth_zscore","operating_margin_zscore","net_margin_zscore","roic_zscore","debt_to_equity_zscore","interest_coverage_zscore","valuation_composite_zscore","quality_factor_zscore"],"breaking":false},{"version":"1.0.0","date":"2025-11-01","type":"launch","summary":"API v1 launched: industry fundamentals","description":"Initial release. Industry-level fundamentals across growth, profitability, valuation, financial strength, efficiency, and management effectiveness. Supports CSIMarket, SIC, and NAICS classification systems. TTM, FY, and Q period types.","endpoints_added":["GET \/api\/v1\/industries","GET \/api\/v1\/industries\/{id}","GET \/api\/v1\/industries\/{id}\/growth","GET \/api\/v1\/industries\/{id}\/profitability","GET \/api\/v1\/industries\/{id}\/valuation","GET \/api\/v1\/industries\/{id}\/financial-strength","GET \/api\/v1\/industries\/{id}\/efficiency","GET \/api\/v1\/industries\/{id}\/management-effectiveness"],"breaking":false}]}