Barquant

Sector and index fundamentals

GET/api/v1/families/us-equities/fundamentals/groups

Income, balance sheet, and cash-flow totals for sectors, industries, and the S&P 500, Nasdaq-100, and Dow Jones, with coverage for every period. Pro and Unlimited.

Description

Returns aggregated statements for each requested key, in the same row shape as listed fundamentals: dollar lines summed in USD across members, margins computed from those totals, and one column per calendar quarter or calendar year. Sectors and industries sum their 25 largest listed members; indices sum the members in the index on each date. Each row also has a coverage entry: how many members reported and what share of the members’ market cap they hold. A period is published only when reporting members hold at least 60% of that market cap. Keys are SECTOR:name, INDUSTRY:name, or INDEX:SPY, INDEX:QQQ, and INDEX:DIA for the S&P 500, Nasdaq-100, and Dow Jones. Names normalize like valuation keys (sector:Consumer Discretionary becomes SECTOR:consumer-discretionary). Sector and industry names follow the current classification (for example SECTOR:consumer-discretionary, SECTOR:consumer-staples, SECTOR:communication, SECTOR:finance, INDUSTRY:software-infrastructure). Earlier sector keys still work: SECTOR:consumer-cyclical, SECTOR:consumer-defensive, SECTOR:communication-services, SECTOR:financial-services, and SECTOR:telecommunications return the current sector. Earlier industry keys work where one successor holds most of the old group. The response lists each one under aliases. With asof, a sector is answered under the name that day used. Retired keys return 404 with a hint. Full table: GET /api/v1/families/us-equities/fundamentals/groups/aliases. An industry with fewer than 5 common stocks is not a peer group: its stocks are listed under the industry Others (INDUSTRY:others), keep their own ratings, and still count in their sector. INDUSTRY:others has no P/E, rating, chart, or statements of its own; it is served with available false and reason others-not-a-group, and the industry keys it replaced resolve to it (named in aliases). Unknown keys and tickers come back null. POST the same path with {"symbols": [...]} for up to 5,000 keys. One key: GET /api/v1/families/us-equities/fundamentals/groups/{key}. Every group of the day: GET /api/v1/families/us-equities/fundamentals/groups/catalog, with optional kind=sector,industry,index. Earlier-classification keys and their successors: GET /api/v1/families/us-equities/fundamentals/groups/aliases. Totals refresh once a day.

Authentication

v1 is client_id plus client_secret on every protected GET. A browser session is not enough. Google sign-in is for the website only — do not send a session cookie to v1.

  • HTTP Basic — Authorization: Basic base64(client_id:client_secret)
  • Headers — X-Client-Id and X-Client-Secret

Create or rotate credentials on Account. Full notes are on Authentication.

Path parameters

This path has no parameters.

Query parameters

ParameterInTypeRequiredDescription
symbolsquerystringYesComma-separated keys (max 500 on GET). Keys are SECTOR:name, INDUSTRY:name, or INDEX:SPY, INDEX:QQQ, and INDEX:DIA for the S&P 500, Nasdaq-100, and Dow Jones. Names normalize like valuation keys (sector:Consumer Discretionary becomes SECTOR:consumer-discretionary). Sector and industry names follow the current classification (for example SECTOR:consumer-discretionary, SECTOR:consumer-staples, SECTOR:communication, SECTOR:finance, INDUSTRY:software-infrastructure). Earlier sector keys still work: SECTOR:consumer-cyclical, SECTOR:consumer-defensive, SECTOR:communication-services, SECTOR:financial-services, and SECTOR:telecommunications return the current sector. Earlier industry keys work where one successor holds most of the old group. The response lists each one under aliases. With asof, a sector is answered under the name that day used. Retired keys return 404 with a hint. Full table: GET /api/v1/families/us-equities/fundamentals/groups/aliases. An industry with fewer than 5 common stocks is not a peer group: its stocks are listed under the industry Others (INDUSTRY:others), keep their own ratings, and still count in their sector. INDUSTRY:others has no P/E, rating, chart, or statements of its own; it is served with available false and reason others-not-a-group, and the industry keys it replaced resolve to it (named in aliases). Example: SECTOR:technology,INDEX:SPY.
asofquerystringNoPast session, YYYY-MM-DD. Omit for the latest day.

Example request

curl -sS -u "$CLIENT_ID:$CLIENT_SECRET" \
  https://barquant.dev/api/v1/families/us-equities/fundamentals/groups?symbols=SECTOR:technology

Response attributes

FieldTypeDescription
familystringAlways us-equities-fundamentals.
as_ofstring | nullDay the totals were published, YYYY-MM-DD.
history_cutoffstring | nullOldest period date this plan receives. Null on Unlimited.
requestedstring[]Normalized keys, in request order.
aliasesobjectOlder sector or industry keys you asked for, mapped to the key served in symbols. Empty when none applied. Full table: GET /api/v1/families/us-equities/fundamentals/groups/aliases.
symbolsobjectOne entry per requested key, or null when the key is unknown.
symbols[key].kind"sector" | "industry" | "index"What the key names.
symbols[key].availablebooleanfalse when no period has enough coverage yet, or for INDUSTRY:others (reason others-not-a-group: industries with fewer than 5 common stocks, no totals).
symbols[key].as_ofstring | nullLatest published period end.
symbols[key].income_statement_quarterobject[]Calendar quarters, newest first. Also income_statement_annual (calendar years) and income_statement_ttm (trailing twelve months at each quarter end).
symbols[key].balance_sheet_statement_quarterobject[]Quarter-end balance sheets. Also balance_sheet_statement_annual.
symbols[key].cash_flow_statement_quarterobject[]Also cash_flow_statement_annual and cash_flow_statement_ttm.
symbols[key].coverageobjectPer statement array: date, published, market_cap_share, reporters, members_sized, members, carried (reporters whose trailing twelve months or balance sheet is carried from their own earlier filing across a missing quarter), semiannual (reporters whose filing for that period is a half-year: they are in the trailing-twelve-month rows but never in single-quarter rows), semiannual_cap_share (the market-cap share of members on a half-year filing schedule at that quarter who did not report it), excluded_cap_share and excluded (the market-cap share of members left out of that period because their own filing for it was excluded, and why: duplicate-quarter, placeholder-quarter, unit-jump, or cash-flow-vs-revenue; set on published periods too, so a total that leaves out a large member is visible), and reason for every period. reason says why an unpublished period is missing: no-reporters, insufficient-sized-members, insufficient-reporters, excluded-members (most of the missing market cap belongs to members whose filing was excluded), semiannual-members (single quarters: most of the missing market cap belongs to half-year filers), insufficient-coverage, or reporting-in-progress (the newest period while its members are still filing: its reporting market-cap share is under 90% of the previous period's, so the latest published period stays the previous complete one); null when published. reason and semiannual_cap_share exist from statements_version 2; on older or archived payloads they read null (not recorded, not 'no reason').
symbols[key].constituentsobject[]Members with symbol, weight, and latest_period. A second share class of one company has weight null and counted_with.
symbols[key].excludedobject[]Members left out, with the reason (share-class-duplicate: counted once, with counted_with).
pendingstring[]Keys whose totals are not published yet. Retry later.

Sample response

{
  "family": "us-equities-fundamentals",
  "as_of": "2026-09-12",
  "computed_at": "2026-09-12T04:31:07Z",
  "history_cutoff": "2006-09-12",
  "requested": [
    "SECTOR:technology"
  ],
  "aliases": {},
  "symbols": {
    "SECTOR:technology": {
      "key": "SECTOR:technology",
      "kind": "sector",
      "name": "Technology",
      "as_of": "2026-06-30",
      "available": true,
      "reason": null,
      "currency": "USD",
      "income_statement_quarter": [
        {
          "date": "2026-06-30",
          "symbol": "SECTOR:technology",
          "reportedCurrency": "USD",
          "calendarYear": "2026",
          "period": "Q2",
          "revenue": 812400000000,
          "grossProfit": 452900000000,
          "grossProfitRatio": 0.5575,
          "netIncome": 201300000000,
          "netIncomeRatio": 0.2478
        }
      ],
      "coverage": {
        "income_statement_quarter": [
          {
            "date": "2026-06-30",
            "published": true,
            "market_cap_share": 0.97,
            "reporters": 24,
            "members_sized": 25,
            "members": 25
          }
        ]
      },
      "constituents": [
        {
          "symbol": "NVDA",
          "weight": 0.19,
          "latest_period": "2026-07-27"
        },
        {
          "symbol": "MSFT",
          "weight": 0.14,
          "latest_period": "2026-06-30"
        }
      ],
      "excluded": []
    }
  },
  "pending": []
}

Errors

StatusWhen
400symbols is missing or over the key limit, or asof is not YYYY-MM-DD.
401Missing or wrong client_id / client_secret.
403Authenticated, but this plan does not include sector and index fundamentals. They start on Pro.
404The single-key path names a ticker or a key that is not in that day’s groups, or the catalog path names an asof day that was never published. A retired sector or industry key also carries a hint.
429Daily quota or per-minute plan quota. Read Retry-After and X-RateLimit-* headers.

401 body:

{
  "error": "Unauthorized"
}

403 body:

{
  "error": "This plan does not include that family.",
  "plan": "basic",
  "requiredPlan": "pro"
}

429 body (per-minute / daily):

{
  "error": "Too many requests."
}

Plan access

Pro: last 20 years. Unlimited: full available history. Free and Basic receive 403. Every request counts as one API request against the plan quota, however many keys it names.

Daily and per-minute quotas live on Plans and limits.

© 2026–2035 Barquant

Sector and index fundamentals · Barquant