How the balance check works, and what it found

Each filing is checked against Assets = Liabilities + Equity when it reports the lines needed; where it does not, it is marked not testable instead of passing. Figures are as reported to the SEC and are never adjusted to make a sheet fit. This page sets out the test, the four reasons a filing is flagged, one dated study of what the test found, and calls you can run yourself.

The check

A balance sheet has to satisfy Assets = Liabilities + Equity. We test it on each filing's own figures: total assets must equal total liabilities plus total equity to within half of one percent of total assets. Equity is total equity including noncontrolling interests where the filer reports it.

If the plain sum misses, we also try adding the lines that sit beside or between liabilities and equity: noncontrolling interest, temporary equity, redeemable preferred stock, redeemable noncontrolling interest and minority interest in an operating partnership. A filing that balances on one of those bases passes, and the response names the basis (identity_basis). A filer that publishes total assets and its own stated total of liabilities and equity, but no separate liabilities or equity line, is tested on that stated total.

A filing that does not report the lines the test needs is returned as not_testable. That is neither a pass nor a failure, and the response names what is missing.

Where the figures come from

The SEC Financial Statement Data Sets, which are the SEC's quarterly bulk release of XBRL facts, and the SEC's XBRL frames API, which brings in filings as they are filed, weeks before the quarter's data set is published. A frames figure takes its filing date from EDGAR's quarterly form index, matched on the accession number, and a figure whose filing cannot be found there is dropped rather than dated by guesswork. Where both routes supply the same figure, the bulk row is kept. Only consolidated values are read: rows for a segment, a geography, an equity component or a coregistrant are ignored. Every figure is as reported, and each line item carries the period it is for and the date of the filing that first reported that value.

What the restated flag means

A line item's restated flag is true only for a figure taken from a vendor's restated series (FMP or Yahoo) rather than as reported to the SEC. A revision in a later SEC filing is not marked this way: it appears as that filing's value and date, and in /api/company/{ticker}/changes.

What the flags mean

A flag is a reason. It is a statement about the arithmetic on figures we hold, not a statement about the filer. There are four.

FlagWhat it means
rounding The components we hold miss total assets by half of one percent to one percent.
missing_tag A line item did not reach us. The gap is one percent of total assets or more, and the filer's own stated total of liabilities and equity agrees with its total assets. The filing agrees with itself and our components fell short. It does not say why the line did not reach us.
unexplained The gap is one percent of total assets or more and we hold no stated total to test against, so the check cannot say whose figures fall short.
broken A filing that does not balance: the filer's own stated total disagrees with its own total assets by more than half of one percent.

In the exceptions feed (Pro and above) each failed check also carries an attribution: filer, extraction (a gap on our side) or unknown. The full definition and examples are on how we check the numbers.

Counted on 2026-10-29 (UTC) across the latest balance sheet of each of 6,252 companies: 5,837 could be tested, 5,643 reconcile and 194 are flagged, as 3 rounding, 182 a line item that did not reach us, 9 with no stated total to test against, and 0 a filing that does not balance. 415 report too little to test. These are companies, not filings, and they move as filings load; the study below counts filings on a frozen date.

The 971-of-995 finding

On 2026-10-09 at 17:12 UTC we took a frozen copy of our database and ran the check on every filing in it that could be tested. The numbers below are from that copy and do not move. Each one is quoted from the published report (2026-10-09), and the 995 failures, their labels and their tickers can be recounted from its CSV. The live site will differ, because its data and the code that reads filings both change.

A failure of our check is not a finding that a filing is wrong. It means the figures we hold for it did not satisfy the identity. The method, the charts and three filings in detail are in the report, and the 995 filings are in a CSV with a link to each filing on EDGAR where we found one.

This count and the live one above measure different things. The live count is the latest balance sheet of each company today. The study is every filing in a two-year window on one date. Neither includes the filings that cannot be tested.

Run it

Responses below were captured from the live service on 2026-10-19. Some fields are left out and none is edited. Live responses change when a new filing arrives.

1. A balance sheet, no key

curl https://balanceproof.dev/api/demo/AAPL

The demo route is rate-limited per address. With a free key the same data is at /api/company/AAPL, sent with an X-API-Key header. Excerpt of the response:

{
  "ticker": "AAPL",
  "company_name": "Apple Inc.",
  "period_end": "2026-06-27",
  "filing_date": "2026-07-31",
  "assets": {
    "total_assets": {
      "value": 383266000000.0,
      "period_end": "2026-06-27",
      "filing_date": "2026-07-31",
      "missing": false,
      "restated": false
    }
  },
  "liabilities": {
    "total_liabilities": {
      "value": 275746000000.0,
      "filing_date": "2026-07-31",
      "restated": false
    },
    "liabilities_and_equity": {
      "value": 383266000000.0,
      "filing_date": "2026-07-31",
      "restated": false
    }
  },
  "equity": {
    "shareholders_equity": {
      "value": 107520000000.0,
      "filing_date": "2026-07-31",
      "restated": false
    }
  },
  "source": "SEC Financial Statement Data Sets (as reported)"
}

2. The check, on a filing that balances

Over MCP, the check_balance_sheet tool; in Python, client.verify(["AAPL"]) for several at once on Pro. Excerpt:

{
  "ticker": "AAPL",
  "period_end": "2026-06-27",
  "filing_date": "2026-07-31",
  "total_assets": 383266000000,
  "total_liabilities": 275746000000,
  "total_equity": 107520000000,
  "balances": true,
  "identity_status": "balanced",
  "identity_basis": "as_filed",
  "imbalance_pct": 0
}

3. The check, on a filing that is flagged

The filer's own stated total balances, and the components we read do not. The response says so instead of adjusting anything:

{
  "ticker": "AACB",
  "company_name": "Artius II Acquisition Inc.",
  "period_end": "2026-06-30",
  "filing_date": "2026-08-05",
  "total_assets": 232407651,
  "total_liabilities": 17309711,
  "total_equity": -17147832,
  "balances": false,
  "identity_status": "missing_tag",
  "imbalance_pct": 99.93,
  "filer_totals_agree": true,
  "filer_totals_note": "The filer's own stated total for liabilities plus equity equals its total assets, so the filing balances as reported; the shortfall is in what this dataset read, not in the filing."
}

4. A point-in-time figure with as_of

The balance sheet exactly as it was public on a date, using only filings made by then. For a backtest this is the original figure before a restatement and not the revision after it. Pro and above.

curl.exe -H "X-API-Key: YOUR_KEY" "https://balanceproof.dev/api/company/AAPL?as_of=2025-03-01"

5. A restatement

Figures are as reported to the SEC. When a later filing revises a figure, the default view shows the revised value under the later filing's date; as_of returns the value known on the date you ask. The changes endpoint lists each revised figure with the original value, the revised one and the filings that said each. Starter and above. The last 90 days of restatements are public at /restatements.

curl.exe -H "X-API-Key: YOUR_KEY" https://balanceproof.dev/api/company/AAPL/changes

Calls with as_of need the Pro plan or above, and the changes endpoint needs Starter or above. A free key does not call them, and they return an error that names the plan that does.

Try it

The free tier is 1,000 calls a month, with no card. Get a free API key and check a company you already know the answer for against EDGAR. The full reference is at the API docs, the definitions are on how we check the numbers, and prices are on the pricing page.