The Best Balance Sheet API: What to Test Before You Buy
Nobody is ranked here. Every provider in this category reads the same free filings from the same free source, so the only question worth asking is what each one does when a filing is ambiguous — and that is testable in an afternoon.
At a glance
Prices and features on the right-hand column change, and this page does not — check their site before you decide anything on it. The rows about method are the ones that stay true.
| BalanceProof | the alternatives | |
|---|---|---|
| Balance sheet reconciles as served | Yes — or the exception is named | Test it: pull A, L and E for fifty filers |
| Tells you the basis it reconciled on | Yes — plain, NCI, mezzanine, or both | Ask |
| Handles redeemable equity | Yes, as its own block | Test it on a SPAC or a biotech |
| Filing date on every figure | Yes — the filing that reported the value | Ask — not all give one |
| Names the filings it cannot read | Yes, by ticker, with the reason | Rare |
| Point-in-time (as_of) for backtests | Yes — only what was filed by that date | Ask |
| Income statement and cash flow, checked | Yes, each period, when the filing reports the lines the check needs (otherwise not_testable) | Rare |
| Python client | pip install balanceproof |
Varies |
| Coverage | 6,257 SEC filers, 1.3M facts | Ask — and ask whether it is SEC-only |
| Free tier without a sales call | Yes | Varies |
Balance sheet API fields: what a response looks like
Before running the tests below on anyone, it helps to know what one response should contain. This is BalanceProof's, for Apple, trimmed to the totals (each line item carries the same keys):
curl -H "X-API-Key: YOUR_KEY" https://balanceproof.dev/api/company/AAPL
{
"ticker": "AAPL",
"period_end": "2026-06-27",
"filing_date": "2026-07-31",
"assets": {
"total_assets": {"concept": "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, "missing": false},
"liabilities_and_equity": {"value": 383266000000.0, "missing": false}
},
"equity": {
"shareholders_equity": {"value": 107520000000.0, "missing": false}
},
"missing_concepts": ["goodwill", "loans", "trading_securities",
"investment_securities", "interbank_deposits",
"deposits", "short_term_borrowings",
"total_equity_incl_nci", "minority_interest",
"temporary_equity", "redeemable_preferred_stock",
"redeemable_noncontrolling_interest",
"minority_interest_operating_partnership"],
"data_quality_issues": [],
"source": "SEC Financial Statement Data Sets (as reported)",
"check": {
"identity_status": "balanced",
"reconciles": true,
"imbalance_pct": 0.0,
"missing_for_check": [],
"note": "Assets equal liabilities plus equity, as filed."
}
}
Four things in it are worth asking any provider for:
- A filing date on every figure, not just a period, so a backtest knows when the number became public.
missinginstead of zero. Coca-Cola never tags total liabilities; itstotal_liabilitiescomes back"value": null, "missing": true, next toliabilities_and_equityand the equity lines needed to derive it. The total liabilities API note walks through that case.- A check result (
identity_status,imbalance_pct,missing_for_check) rather than a silent pass. - A
restatedflag, so a revised figure is not passed off as the original.
In Python, pip install balanceproof, then
balanceproof.Client(api_key="YOUR_KEY").check("AAPL") returns the
check object above and .balance_sheet("AAPL") the
whole response. Every field is in the API reference, and a
free key (1,000 calls a month, no card) is on the
dashboard.
Is the free SEC API enough?
Often, yes. SEC's companyfacts endpoint is free, needs no key, and has the full tagged history. It is enough for one company and one well-tagged concept, when you are happy to write the de-duplication yourself. It does not tell you whether a balance sheet adds up, it returns nothing when a filer never tagged a subtotal, and it repeats each period once per filing that reported it (why that matters). For every SEC filer at once, bulk balance sheet data for all companies covers both routes.
Why transparency matters more than a number
Every provider in this category reads the same filings. The difference is what happens when a filing is hard to read. The usual answer is that you get a number anyway, with nothing attached to say how confident it is — and a figure that is quietly a segment instead of a company looks exactly like one that is right.
BalanceProof checks each balance sheet against Assets = Liabilities + Equity when it reports the lines needed, and marks it not testable instead of passing it when it does not. A filing that reconciles is published with its figures. A filing that does not is published with the reason: a noncontrolling interest reported as a separate line, mezzanine equity outside permanent equity, rounding inside one percent, a component we could not read, or a filing whose own totals disagree with each other. The exceptions are counted in public and named individually on how we verify.
That is the whole claim. Not that nothing is ever wrong — that when something is, you are told which number and why, instead of finding out from your own reconciliation three weeks later.
The difference is which tag gets picked
Every provider in this category reads the same source. SEC EDGAR publishes XBRL for every filer, free, and nobody has better raw material than anybody else. What separates one API from the next is not access. It is the selection step, and that step is almost never documented.
Here is the problem it has to solve. Open JPMorgan's 10-Q and search for
Assets and you get twenty-three facts. Not twenty-three values —
twenty-three tagged instances, one for the consolidated bank and one for each
segment and subsidiary that has to be broken out separately. Every one is
valid XBRL. Exactly one is the number on the face of the balance sheet, and
the only thing marking it is an absence: it is the fact with no
dimensions attached.
An extractor that takes the first match, or the largest, or the most recently filed, will be right most of the time and wrong in a way that leaves no trace. No exception, no null, no warning. Just a number that is a segment instead of a company. SEC's companyfacts API already drops the dimensioned facts, so there the failures move elsewhere: in our 100-company test (September 2026) a naive script found no total liabilities tag for 17 companies, a stale equity tag for 8, and headline totals that did not satisfy A = L + E in about a third of the companies it could check.
BalanceProof resolves it with arithmetic rather than a heuristic: pull every candidate for assets, liabilities and equity, and keep the combination that satisfies Assets = Liabilities + Equity. The consolidated figures balance against each other. A segment's assets do not balance against the whole company's liabilities. The identity is a test, not a guideline, and it is the reason a figure here is checked rather than guessed at.
When nothing balances, the answer is that nothing balances. The filing is served as-reported with a warning on it rather than adjusted until the columns agree, because a filing that does not add up is a fact about the company, and you should get it as one.
What we are not going to pretend
We are not going to put the alternatives's prices in a table on our own website. They change, this page would not, and you would be reading a number we had no way to verify at the moment you read it. Go and look at their pricing page. It is the only copy that is current.
We are also not going to tell you their data is bad. We have not audited it and we are not in a position to. What we can tell you is what this service does and how to check it, which is the part we are actually responsible for.
The check that settles it costs you nothing either way: take a company where you already know the answer, call both, and compare each against the filing on EDGAR. Not against each other — against the filing. That is the only comparison that means anything, and it is why the free tier here needs no card.