QuickBooks Online returns a profit and loss report as a tree of sections, headers and summary rows. Xero returns the same report as rows of cells whose values are strings. Business Central returns flat lines with an indentation number for layout, and NetSuite has no REST endpoint for the report at all. A financial statement API for your customers' accounting systems has to absorb all four, which is why "pull the P&L" is rarely one call. The statements here come from the ledgers your customers run, not from public-company filings at the SEC (updated October 2026).
Lending, FP&A, month-end close and embedded reporting all start from the same five statements: profit and loss, balance sheet, trial balance, cash flow and aged receivables or payables. Most accounting APIs were built around records you create and edit, such as invoices and bills. Statements are computed from those records, and each vendor decided differently how much of that computation to expose.
Native statement endpoints by ledger
The table shows what each platform's own API offers today. "Build" means the platform gives you account balances or ledger lines and leaves the statement to you.

QuickBooks Online has the widest native set. GET /v3/company/{realmId}/reports/ProfitAndLoss?start_date=2026-01-01&end_date=2026-09-30 returns the report, and the same path pattern serves BalanceSheet, TrialBalance, CashFlow, AgedReceivables and AgedPayables. Intuit's Java SDK lists the parameters, including accounting_method for cash or accrual and summarize_column_by for comparison columns by month, quarter or customer.
Xero has two APIs for statements. The Accounting API serves /Reports/ProfitAndLoss, /Reports/BalanceSheet and /Reports/TrialBalance, and all three take a paymentsOnly flag for cash basis; the profit and loss report also takes up to 12 comparison periods and two tracking categories, according to Xero's OpenAPI spec. Aged receivables and payables are reported per contact. The separate Finance API, which Xero describes as endpoints customers "can use in the course of a loan application", returns typed statements under /FinancialStatements/, including a cash flow statement that is "not available in US region at this stage."
Business Central exposes the most statements as plain resources. Its API v2.0 has incomeStatements, balanceSheets, cashFlowStatements, trialBalances and aged receivables and payables, and it is the one platform here with a statement of retained earnings (retainedEarningsStatements).
NetSuite and Sage Intacct give you balances instead. NetSuite's REST API has no profit and loss record, so integrations query transactionaccountingline and related tables through SuiteQL, which returns at most 100,000 results. Oracle's new AI Connector Service adds an ns_runReport tool that runs standard reports, but it is built for AI clients over MCP rather than as an integration API. Sage Intacct's get_trialbalance needs no report definition and filters by department, location, project and the other dimensions; a P&L comes from mapping those balances to account groups.
MYOB returns flat profit and loss and balance sheet summaries with no subtotals. Exact Online keeps balances per account per fiscal period, with a flag for balance sheet or P&L. Zoho Books publishes no reports endpoint in its OpenAPI bundle.
One P&L, four shapes
The output format causes more work than the endpoint. In QuickBooks, each row in a report is either a section with a header, nested rows and a summary, or a data row of column values, as the SDK's Report.xsd defines it. Xero's Accounting API uses header, section, row and summary-row types with every cell value as a string, so "20825.41" has to be parsed. Business Central flattens the layout into lines and encodes the hierarchy in lineType and indentation. MYOB returns a flat list of account totals.
A parser written for one of these doesn't read the others. You walk the tree and skip header and summary rows, then convert strings to numbers and rebuild the subtotals the platform didn't send, once per ledger you support.
Pitfalls that change the numbers
Cash or accrual is a parameter on some platforms and absent on others. QuickBooks takes accounting_method and Xero takes paymentsOnly; the MYOB parameter is ReportingBasis, and FreshBooks uses cash_based. Sage Intacct picks a whole reporting book, accrual or cash, "depending on the company configuration". Business Central and Exact Online document no switch. Send the basis you want and record the one you got, because a lender comparing two borrowers on different bases compares nothing.
Periods follow the company's fiscal year. A trial balance mixes cumulative balance sheet accounts with income and expense accounts that run from the start of the fiscal year, and period-based ledgers such as Exact Online snap your dates to their own periods. Ask for the customer's actual period boundary, not the calendar month.
Multi-entity books need the platform's consolidation engine. Oracle's SuiteCloud guidance for NetSuite warns that "a SuiteQL SUM across all subsidiaries is not a consolidated figure", because it adds amounts before eliminations and currency translation. Sage Intacct requires a location filter in companies with more than one base currency.
The layout belongs to the customer. Statements follow their own chart of accounts and account groups, so the line called "Current assets" in one company may not exist in another. Decide where you get the classification before you promise ratios.
Aged receivables are not a filtered invoice list. The aging report is computed as of a date, nets credit notes and unapplied payments the ledger knows about, and buckets balances by a period length. A list of unpaid invoices filtered by today's date gives a different number for any past date.
The trial balance as a fallback
Every ledger in the table except Zoho Books documents per-account balances, either as a native trial balance or as balances per period. That makes the trial balance the statement you can always build from: classify each account as balance sheet or P&L by its account type, map it to your own structure, and sum. Sage Intacct recommends its account balance function over querying raw balance records, which it says "can be very complex" and may return thousands of rows.
Two limits apply. A cash flow statement needs balance changes plus a classification of each account into operating, investing and financing, which no ledger hands you for free. Consolidated figures can't be rebuilt from summed balances, as NetSuite's guidance above shows.
Financial statement API options compared
Several unified APIs normalize statements across ledgers. They differ on coverage, and on whether you read a live result or a stored copy. Each row below comes from the vendor's own documentation.

Two differences matter most. Three of them serve statements from data they sync and store, so a statement is as fresh as the last sync: Merge and Codat both work this way, and Rutter also returns statements "on a monthly basis". Chift and Knit don't offer a profit and loss or balance sheet endpoint, so you build those from account balances or ledger data yourself.
Statements through the Apideck Accounting API
Apideck's Accounting API has five read-only statement endpoints, and coverage differs by statement as of 20 October 2026: trial balance on 27 connectors, profit and loss and balance sheet on 18 each, aged debtors on 8 and aged creditors on 7. Where the ledger has a native report, Apideck reads it, and where it doesn't, such as NetSuite and Exact Online, the connector computes the statement from ledger balances. Each request goes to the ledger at call time and nothing is stored in between.
A balance sheet as of a date is one call:
curl "https://unify.apideck.com/accounting/balance-sheet?filter[end_date]=2026-09-30" \
-H "Authorization: Bearer $APIDECK_API_KEY" \
-H "x-apideck-app-id: $APIDECK_APP_ID" \
-H "x-apideck-consumer-id: customer-123" \
-H "x-apideck-service-id: xero"
The period_count and period_type filters return several periods in one response, but only Xero honors them, as the FP&A guide explains; on other ledgers, loop one call per period. On profit and loss and balance sheet, the accounting_method filter applies only on the QuickBooks connectors and Xero.
The gaps are worth knowing before you plan. Business Central and MYOB have native profit and loss and balance sheet endpoints that the unified API doesn't map yet, and cash flow and retained earnings aren't unified at all. Where the ledger has a native endpoint for those, Proxy passes your request through to it with the same connection. If your product needs statements across many ledgers, build on the trial balance, which has the widest coverage, and add profit and loss and balance sheet where your customers' ledgers support them. The Accounting API coverage pages show each ledger before you commit to a statement in your product.
Ready to get started?
Scale your integration strategy and deliver the integrations your customers need in record time.








