Xero Accounting API – Financial Reports.
Requires accounting.reports.read scope.
Standard users with the "No reports" role receive HTTP 403.
Organisations using cashflow basis: use payments_only: true.
Available Reports
| Function | Xero Report | Notes |
|---|---|---|
balance_sheet/3 | Balance Sheet | Assets, liabilities, equity |
profit_and_loss/3 | Profit and Loss | Revenue and expenses |
trial_balance/3 | Trial Balance | All accounts with debit/credit balances |
executive_summary/3 | Executive Summary | KPI dashboard |
bank_summary/3 | Bank Summary | Bank account movements |
budget_summary/3 | Budget Summary | Budget vs actuals |
aged_receivables/4 | Aged Receivables By Contact | Debtors report |
aged_payables/4 | Aged Payables By Contact | Creditors report |
ten_ninety_nine/3 | 1099 Report | US only |
bas/2 | BAS Report | AU only |
gst/3 | GST Report | AU/NZ only |
list/2 | Report Index | All available reports |
Summary
Functions
Returns the Aged Payables By Contact report for a specific contact.
Returns the Aged Receivables By Contact report for a specific contact.
Returns the Balance Sheet report.
Returns the Bank Summary report.
Returns the BAS (Business Activity Statement) report for AU organisations. Returns a list of all completed BAS reports with no parameters.
Returns the Budget Summary report.
Returns the Executive Summary report (KPI dashboard).
Returns a specific BAS report by ID (AU organisations only).
Returns a specific GST report by ID (AU/NZ only).
Returns the GST report (AU/NZ organisations only).
Lists all reports available to the connected organisation.
Returns the Profit and Loss report.
Returns the 1099 report (US organisations only).
Returns the Trial Balance report.
Functions
@spec aged_payables(Xero.Auth.Token.t(), String.t(), String.t(), keyword()) :: {:ok, map()} | {:error, Xero.Error.t()}
Returns the Aged Payables By Contact report for a specific contact.
Parameters
contact_id— UUID of the contact (required)
Options
:date— Reporting date (YYYY-MM-DD):from_date/:to_date— Date range
@spec aged_receivables(Xero.Auth.Token.t(), String.t(), String.t(), keyword()) :: {:ok, map()} | {:error, Xero.Error.t()}
Returns the Aged Receivables By Contact report for a specific contact.
Parameters
contact_id— UUID of the contact (required)
Options
:date— Reporting date (YYYY-MM-DD):from_date/:to_date— Date range
@spec balance_sheet(Xero.Auth.Token.t(), String.t(), keyword()) :: {:ok, map()} | {:error, Xero.Error.t()}
Returns the Balance Sheet report.
Options
:date— Reporting date (YYYY-MM-DD, default: today):periods— Number of comparison periods (0–11):time_frame—"MONTH"|"QUARTER"|"YEAR":tracking_option_id1/:tracking_option_id2— Filter by tracking options:standard_layout— Use standard layout (boolean, default true):payments_only— Cash-basis mode (boolean, default false)
@spec bank_summary(Xero.Auth.Token.t(), String.t(), keyword()) :: {:ok, map()} | {:error, Xero.Error.t()}
Returns the Bank Summary report.
Options
:from_date/:to_date— Date range (YYYY-MM-DD)
@spec bas(Xero.Auth.Token.t(), String.t()) :: {:ok, map()} | {:error, Xero.Error.t()}
Returns the BAS (Business Activity Statement) report for AU organisations. Returns a list of all completed BAS reports with no parameters.
@spec budget_summary(Xero.Auth.Token.t(), String.t(), keyword()) :: {:ok, map()} | {:error, Xero.Error.t()}
Returns the Budget Summary report.
Options
:date— Reporting date (YYYY-MM-DD):periods— Number of periods (1–12):time_frame—"MONTH"|"QUARTER"|"YEAR"
@spec executive_summary(Xero.Auth.Token.t(), String.t(), keyword()) :: {:ok, map()} | {:error, Xero.Error.t()}
Returns the Executive Summary report (KPI dashboard).
Options
:date— Reporting date (YYYY-MM-DD)
@spec get_bas(Xero.Auth.Token.t(), String.t(), String.t()) :: {:ok, map()} | {:error, Xero.Error.t()}
Returns a specific BAS report by ID (AU organisations only).
@spec get_gst(Xero.Auth.Token.t(), String.t(), String.t()) :: {:ok, map()} | {:error, Xero.Error.t()}
Returns a specific GST report by ID (AU/NZ only).
@spec gst(Xero.Auth.Token.t(), String.t(), keyword()) :: {:ok, map()} | {:error, Xero.Error.t()}
Returns the GST report (AU/NZ organisations only).
Options
:from_date/:to_date— Reporting period (YYYY-MM-DD)
@spec list(Xero.Auth.Token.t(), String.t()) :: {:ok, map()} | {:error, Xero.Error.t()}
Lists all reports available to the connected organisation.
@spec profit_and_loss(Xero.Auth.Token.t(), String.t(), keyword()) :: {:ok, map()} | {:error, Xero.Error.t()}
Returns the Profit and Loss report.
Options
:from_date/:to_date— Date range (YYYY-MM-DD):periods— Number of comparison periods (0–11):time_frame—"MONTH"|"QUARTER"|"YEAR":tracking_category_id/:tracking_category_id2— Segment by tracking category:tracking_option_id/:tracking_option_id2— Filter by specific tracking option:standard_layout— Use standard layout (boolean):payments_only— Cash-basis mode (boolean)
@spec ten_ninety_nine(Xero.Auth.Token.t(), String.t(), keyword()) :: {:ok, map()} | {:error, Xero.Error.t()}
Returns the 1099 report (US organisations only).
Options
:report_year— Tax year (e.g."2024")
@spec trial_balance(Xero.Auth.Token.t(), String.t(), keyword()) :: {:ok, map()} | {:error, Xero.Error.t()}
Returns the Trial Balance report.
Options
:date— Reporting date (YYYY-MM-DD):payments_only— Cash-basis mode (boolean)