---
title: "A company's verified narrative customer-concentration disclosure (\"one customer accounted for 31% of revenue\"): each figure's basis, customer count, percentage, period, and verbatim quote, with the source filing. hasDisclosure is false when this REST surface returns no narrative row — missReason then says why: current tagged XBRL served by the MCP tool, a scanned filing that stated nothing, a company outside coverage because it files only foreign private issuer reports (20-F, 40-F, 6-K) and no 10-K or 10-Q, or a company not processed yet. A newer narrative supersedes stale tags. Never a statement of no risk."
method: GET
path: "/v1/stocks/{ticker}/customer-concentration"
tags: ["Fundamentals"]
---

# A company's verified narrative customer-concentration disclosure ("one customer accounted for 31% of revenue"): each figure's basis, customer count, percentage, period, and verbatim quote, with the source filing. hasDisclosure is false when this REST surface returns no narrative row — missReason then says why: current tagged XBRL served by the MCP tool, a scanned filing that stated nothing, a company outside coverage because it files only foreign private issuer reports (20-F, 40-F, 6-K) and no 10-K or 10-Q, or a company not processed yet. A newer narrative supersedes stale tags. Never a statement of no risk.

`GET /v1/stocks/{ticker}/customer-concentration`

## Request

- Base URL: `https://api.equibles.com`
- URL: `https://api.equibles.com/v1/stocks/{ticker}/customer-concentration`
- Auth: HTTP bearer
- TypeScript: <https://skmtc.dev/equibles/apis/equibles-api/docs/v1/stocks/:ticker/customer-concentration/get.ts> (a function with typed inputs; its response is checked against the schema)

## Path parameters

- `ticker` string, required

## Response `200`

OK

- CustomerConcentrationResponse
  - `ticker` string, nullable
  - `companyName` string, nullable
  - `hasDisclosure` boolean
  - `form` string, nullable
  - `filedDate` string, date, nullable
  - `filingUrl` string, nullable
  - `headline` ConcentrationFigureDto
    - `basis` string, nullable
    - `customerCount` integer, nullable
    - `percent` number, double
    - `period` string, nullable
    - `quote` string, nullable
  - `figures` ConcentrationFigureDto[], nullable
    - `basis` string, nullable
    - `customerCount` integer, nullable
    - `percent` number, double
    - `period` string, nullable
    - `quote` string, nullable
  - `missReason` string, nullable: Why hasDisclosure is false (null when it is true): "tagged-xbrl" — the issuer has current structured XBRL that takes precedence over the narrative row; "nothing-found" — the latest scanned filing states no disclosure (see lastScannedForm/lastScannedFiledDate); "not-covered": no 10-K or 10-Q is on file, only foreign private issuer reports (20-F, 40-F, 6-K) the lane does not read; "not-processed" — the company's filings have not been examined yet.
  - `lastScannedForm` string, nullable: Form of the latest scanned filing when missReason is "nothing-found"; null otherwise.
  - `lastScannedFiledDate` string, date, nullable: Filed date of that filing; null unless missReason is "nothing-found".

## Other responses

- `400`: Invalid request — a malformed parameter value or a query parameter this endpoint does not support.
- `404`: Not Found

---

[API](https://skmtc.dev/equibles/apis/equibles-api.md) - [All operations](https://skmtc.dev/equibles/apis/equibles-api/llms.txt) - [OpenAPI document](https://skmtc.dev/equibles/apis/equibles-api/revisions/666e06778588?raw)
