Dashboard

Concentration Risk

GET/api/footnotes/concentration

Pro

Returns concentration-risk disclosures as time series: named-counterparty dependence (e.g. "Apple is 50% of revenue, up from 37% three years ago"), unnamed aggregates ("top ten customers"), and the same machinery for supplier, geographic, product, and credit concentration.

Unlike the other financials endpoints this response is series-major, not period-major: disclosures are grouped by (riskType, benchmark) category, e.g. customer × revenue vs customer × receivables, and each counterparty carries its own history. Grouping is by stable category, not raw XBRL member, so a filer switching benchmark members across years keeps one continuous series; the raw rider members are listed in riskTypeMembers / benchmarkMembers for auditability.

Counterparty names are the filer's own extension members (rfmd:AppleMember → "Apple"); no entity resolution is attempted, the label is the filer's own word. When the filer also tagged the dollar amount for the same counterparty and period (a minority of filers do), it attaches to the share point as revenue, converted per the currency parameter (spot for balance-date shares' amounts, period-average for flows) with the response-level fx audit block. Shares themselves are pure fractions and never converted.

What this data can tell you:

Data honesty notes:

Get API key Try it live in the API explorer

Query parameters

Example request

curl 'https://api.stockfit.io/v1/api/footnotes/concentration?symbol=AAPL&cik=320193&cusip=037833100&composite_figi=BBG000B9XRY4&share_class_figi=BBG001S5N8V8&currency=USD' \
  -H 'Authorization: Bearer YOUR_API_TOKEN'

Responses

200 OK

Concentration-risk series grouped by risk type and benchmark

Response schema

  • groups array of object

    One group per (riskType, benchmark) category combination, groups with named counterparties first.

    array of:
    • riskType string (enum) | null

      Stable category of the ConcentrationRiskByTypeAxis rider; `other` for unmapped members, null when the filer tagged no type.

      Allowed values: customer, supplier, geographic, product, credit, reinsurer, governmentContracts, labor, lender, other, null
    • benchmark string (enum) | null

      Stable category of the ConcentrationRiskByBenchmarkAxis rider, what the share is a percentage OF.

      Allowed values: revenue, receivables, payables, costOfRevenue, assets, other, null
    • riskTypeMembers array of string

      Raw rider member QNames observed in this group.

    • benchmarkMembers array of string
    • counterparties array of object

      One series per named counterparty, sorted by latest share descending.

      array of:
      • member string

        Raw XBRL member QName, a filer extension naming the counterparty

      • name string

        Derived display label, the filer's own word, no entity resolution

      • history array of object

        Newest first, up to `limit` points.

        array of:
        • period string (date)
        • fiscalYear integer
        • fiscalPeriod string (enum)

          Fiscal period of a reported value: `FY` (annual) or `Q1`-`Q4` (quarterly).

          Allowed values: FY, Q1, Q2, Q3, Q4
        • share number

          Concentration share as a fraction of 1

        • normalized boolean

          Only present (as `true`) when the share was re-scaled from a mis-tagged whole percent.

        • revenue number

          Disclosed dollar amount for this counterparty and period, when the filer tagged it

        • currency string | null

          Currency of `revenue` after conversion; only present beside `revenue`

        • dateFiled string (date) | null

          SEC filing acceptance date of the share's source filing, use to gate point-in-time access

    • aggregate object | null

      Share series tagged WITHOUT a named counterparty (e.g. "top ten customers combined"). Null when absent.

      • history array of object
        array of:
        • period string (date)
        • fiscalYear integer
        • fiscalPeriod string (enum)

          Fiscal period of a reported value: `FY` (annual) or `Q1`-`Q4` (quarterly).

          Allowed values: FY, Q1, Q2, Q3, Q4
        • share number
        • normalized boolean
        • dateFiled string (date) | null
  • fx object

    Foreign-currency conversion audit for this period. Every monetary value in `facts` is in the requested `currency` (default **US dollars**). This block is absent when the period was already wholly in the target currency (e.g. a US filer with the default USD, nothing to convert). It is present when one or more line items were originally filed in a different currency and converted on the fly, and it records the exact rate(s) applied so the conversion can be reproduced. Rates come from the Frankfurter API (api.frankfurter.dev). Instant balance-sheet items use the spot rate at period end; flow income/cash-flow items use the day-weighted average rate over the period.

    • targetCurrency string

      The currency (ISO 4217) every `facts` value was converted INTO, the value of the request `currency` parameter (default USD). The literal `original` here means no conversion was requested: each fact stays in its as-reported currency (see `unconverted` for the per-fact mapping).

    • originalCurrencies array of string

      Every source currency (ISO 4217) that appeared in this period, the union of converted, unconverted, and already-in-target. The target currency itself is listed when some facts were natively in it (e.g. a foreign filer reporting some lines in USD alongside its converted local currency), so a mixed period reflects its true composition rather than appearing wholly converted.

    • rates array of object

      One entry per (source currency, method) actually applied. `rate` is the multiplier: `target = original * rate`.

      array of:
      • from string

        ISO 4217 source currency that was converted.

      • method string (enum)

        `spot` for instant balance-sheet items (rate at period end); `average` for flow income/cash-flow items (day-weighted mean over the period).

        Allowed values: spot, average
      • rate number

        Multiply the original-currency amount by this to get the `targetCurrency` amount.

      • effectiveDate string (date)

        Spot only: the date (YYYY-MM-DD) the applied rate was published (≤ period end).

      • start string (date)

        Average only: period start (YYYY-MM-DD).

      • end string (date)

        Average only: period end (YYYY-MM-DD).

    • unconverted map of string to array of string

      Facts that could NOT be converted (no published rate within tolerance, or an unsupported code/date), grouped by the currency they remain in: each key is a source ISO 4217 code, each value lists the curated fact names in `facts` still in that currency (NOT `targetCurrency`). Absent when everything converted. Use it to know exactly which figures to treat as native currency.

      • * (additional properties) array of string

Example response

{
  "groups": [
    {
      "riskType": "customer",
      "benchmark": "revenue",
      "riskTypeMembers": [
        "us-gaap:CustomerConcentrationRiskMember"
      ],
      "benchmarkMembers": [
        "us-gaap:SalesRevenueNetMember",
        "us-gaap:RevenueFromContractWithCustomerMember"
      ],
      "counterparties": [
        {
          "member": "rfmd:AppleMember",
          "name": "Apple",
          "history": [
            {
              "period": "2026-03-28",
              "fiscalYear": 2026,
              "fiscalPeriod": {},
              "share": 0.5,
              "normalized": true,
              "revenue": 3800000000,
              "currency": "USD",
              "dateFiled": "2026-05-15"
            }
          ]
        }
      ],
      "aggregate": {
        "history": [
          {
            "period": "string",
            "fiscalYear": 0,
            "fiscalPeriod": {},
            "share": 0,
            "normalized": true,
            "dateFiled": "string"
          }
        ]
      }
    }
  ],
  "fx": {}
}

400 Bad Request

Invalid parameters or symbol not found

Response schema

  • error string

    Human-readable error message

Example response

{}

403 Forbidden

Feature not available on current plan

Response schema

  • error string

    Human-readable error message

Example response

{}