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-IdandX-Client-Secret
Create or rotate credentials on Account. Full notes are on Authentication.
Path parameters
This path has no parameters.
Query parameters
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
symbols | query | string | Yes | Comma-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. |
asof | query | string | No | Past 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:technologyResponse attributes
| Field | Type | Description |
|---|---|---|
family | string | Always us-equities-fundamentals. |
as_of | string | null | Day the totals were published, YYYY-MM-DD. |
history_cutoff | string | null | Oldest period date this plan receives. Null on Unlimited. |
requested | string[] | Normalized keys, in request order. |
aliases | object | Older 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. |
symbols | object | One entry per requested key, or null when the key is unknown. |
symbols[key].kind | "sector" | "industry" | "index" | What the key names. |
symbols[key].available | boolean | false 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_of | string | null | Latest published period end. |
symbols[key].income_statement_quarter | object[] | 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_quarter | object[] | Quarter-end balance sheets. Also balance_sheet_statement_annual. |
symbols[key].cash_flow_statement_quarter | object[] | Also cash_flow_statement_annual and cash_flow_statement_ttm. |
symbols[key].coverage | object | Per 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].constituents | object[] | Members with symbol, weight, and latest_period. A second share class of one company has weight null and counted_with. |
symbols[key].excluded | object[] | Members left out, with the reason (share-class-duplicate: counted once, with counted_with). |
pending | string[] | 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
| Status | When |
|---|---|
| 400 | symbols is missing or over the key limit, or asof is not YYYY-MM-DD. |
| 401 | Missing or wrong client_id / client_secret. |
| 403 | Authenticated, but this plan does not include sector and index fundamentals. They start on Pro. |
| 404 | The 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. |
| 429 | Daily 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