Xero Finance API – Financial data endpoints for lending and accounting activity analysis.
Base URL: https://api.xero.com/finance.xro/1.0/
Scopes Required
| Endpoint | Scope |
|---|---|
| Bank Statements Plus | finance.statements.read |
| Cash Validation | finance.cashvalidation.read |
| Financial Statements | finance.financialstatements.read |
| Accounting Activity | finance.accountingactivity.read |
Sub-APIs
- Bank Statements Plus — Raw bank statement lines with merchant enrichment and categorisation
- Cash Validation — Validates cash position accuracy between bank statements and Xero
- Financial Statements — Balance Sheet, P&L, Trial Balance, Cash Flow (snapshot views)
- Accounting Activity — Lock history, report activity, and user activity statistics
Examples
# Check if cash balances match bank statements
{:ok, validation} = Xero.Finance.cash_validation(token, tenant_id,
balance_date: "2024-01-31")
# Get enriched bank statement data for lending
{:ok, data} = Xero.Finance.bank_statements(token, tenant_id,
bank_account_id: "account-uuid",
from_date: "2024-01-01",
to_date: "2024-12-31")
Summary
Functions
Returns ledger lock history (period-end lock dates).
Scope: finance.accountingactivity.read
Returns an overview of the organisation's accounting activity.
Scope: finance.accountingactivity.read
Returns a Balance Sheet snapshot.
Scope: finance.financialstatements.read
Returns enriched bank statement data with merchant categorisation.
Scope: finance.statements.read
Returns a Cash Flow Statement.
Scope: finance.financialstatements.read
Validates cash position accuracy — identifies discrepancies between Xero account
balances and the actual bank statement balances.
Scope: finance.cashvalidation.read
Returns a Profit and Loss statement.
Scope: finance.financialstatements.read
Returns report activity statistics (number of reports run, users, frequency).
Scope: finance.accountingactivity.read
Returns a Trial Balance snapshot.
Scope: finance.financialstatements.read
Returns user activity statistics (active users, activity levels).
Scope: finance.accountingactivity.read
Functions
@spec accounting_activity(Xero.Auth.Token.t(), String.t(), keyword()) :: {:ok, map()} | {:error, Xero.Error.t()}
Returns ledger lock history (period-end lock dates).
Scope: finance.accountingactivity.read
Options
:start_month— Start month (YYYY-MM):end_month— End month (YYYY-MM)
@spec accounting_activity_overview(Xero.Auth.Token.t(), String.t(), keyword()) :: {:ok, map()} | {:error, Xero.Error.t()}
Returns an overview of the organisation's accounting activity.
Scope: finance.accountingactivity.read
Options
:start_month— Start month (YYYY-MM):end_month— End month (YYYY-MM)
@spec balance_sheet(Xero.Auth.Token.t(), String.t(), keyword()) :: {:ok, map()} | {:error, Xero.Error.t()}
Returns a Balance Sheet snapshot.
Scope: finance.financialstatements.read
Options
:balance_date— Reporting date (YYYY-MM-DD):periods— Number of comparison periods:timeframe—"MONTH"|"QUARTER"|"YEAR":tracking_category_id/:tracking_option_id— Filter by tracking segment:standard_layout— Use standard layout (boolean):payments_only— Cash-basis reporting (boolean)
@spec bank_statements(Xero.Auth.Token.t(), String.t(), keyword()) :: {:ok, map()} | {:error, Xero.Error.t()}
Returns enriched bank statement data with merchant categorisation.
Scope: finance.statements.read
Options
:bank_account_id— UUID of the bank account (required):from_date— Start date (YYYY-MM-DD):to_date— End date (YYYY-MM-DD):summary_only— Return aggregated summary only (boolean)
@spec cash_flow(Xero.Auth.Token.t(), String.t(), keyword()) :: {:ok, map()} | {:error, Xero.Error.t()}
Returns a Cash Flow Statement.
Scope: finance.financialstatements.read
Options
:start_month— Start month (YYYY-MM):end_month— End month (YYYY-MM)
@spec cash_validation(Xero.Auth.Token.t(), String.t(), keyword()) :: {:ok, map()} | {:error, Xero.Error.t()}
Validates cash position accuracy — identifies discrepancies between Xero account
balances and the actual bank statement balances.
Scope: finance.cashvalidation.read
Options
:balance_date— Date to validate cash position (YYYY-MM-DD):begin_date— Start of validation period:include_credit_transactions— Include credit card accounts (boolean, default false)
@spec profit_and_loss(Xero.Auth.Token.t(), String.t(), keyword()) :: {:ok, map()} | {:error, Xero.Error.t()}
Returns a Profit and Loss statement.
Scope: finance.financialstatements.read
Options
:start_month— Start month (YYYY-MM):end_month— End month (YYYY-MM):periods— Number of comparison periods:timeframe—"MONTH"|"QUARTER"|"YEAR":tracking_category_id/:tracking_category_id2— Filter by tracking segment:standard_layout— Use standard layout (boolean):payments_only— Cash-basis reporting (boolean)
@spec report_activity(Xero.Auth.Token.t(), String.t(), keyword()) :: {:ok, map()} | {:error, Xero.Error.t()}
Returns report activity statistics (number of reports run, users, frequency).
Scope: finance.accountingactivity.read
Options
:start_month— Start month (YYYY-MM):end_month— End month (YYYY-MM)
@spec trial_balance(Xero.Auth.Token.t(), String.t(), keyword()) :: {:ok, map()} | {:error, Xero.Error.t()}
Returns a Trial Balance snapshot.
Scope: finance.financialstatements.read
Options
:end_month— Reporting month (YYYY-MM):start_month— Start of range for comparison
@spec user_activities(Xero.Auth.Token.t(), String.t(), keyword()) :: {:ok, map()} | {:error, Xero.Error.t()}
Returns user activity statistics (active users, activity levels).
Scope: finance.accountingactivity.read
Options
:data_month— Month to query (YYYY-MM)