Xero Financial Reports
Overview
Xero provides a comprehensive set of financial reports through the API. For MSPs, these reports are essential for tracking profitability by service line, monitoring client payment behavior, managing cash flow, and producing financial statements for stakeholders. The Reports API returns structured data that can be programmatically analyzed.
Core Concepts
Available Reports
| Report | Endpoint | Description |
|---|---|---|
| Profit and Loss | /Reports/ProfitAndLoss | Revenue, expenses, and net profit |
| Balance Sheet | /Reports/BalanceSheet | Assets, liabilities, and equity |
| Aged Receivables | /Reports/AgedReceivablesByContact | Outstanding customer invoices by age |
| Aged Payables | /Reports/AgedPayablesByContact | Outstanding supplier bills by age |
| Trial Balance | /Reports/TrialBalance | All account balances at a point in time |
| Bank Summary | /Reports/BankSummary | Summary of bank account activity |
| Budget Summary | /Reports/BudgetSummary | Budget vs actual comparison |
| Executive Summary | /Reports/ExecutiveSummary | High-level financial overview |
Report Response Structure
All Xero reports follow a consistent structure:
{
"Reports": [
{
"ReportID": "ProfitAndLoss",
"ReportName": "Profit and Loss",
"ReportType": "ProfitAndLoss",
"ReportDate": "23 February 2026",
"UpdatedDateUTC": "/Date(1772006400000)/",
"Rows": [
{
"RowType": "Header",
"Cells": [
{ "Value": "" },
{ "Value": "1 Mar 2026 to 31 Mar 2026" }
]
},
{
"RowType": "Section",
"Title": "Revenue",
"Rows": [
{
"RowType": "Row",
"Cells": [
{ "Value": "Managed Services Revenue", "Attributes": [{ "Value": "acc-id-200" }] },
{ "Value": "45000.00", "Attributes": [{ "Value": "acc-id-200" }] }
]
}
]
},
{
"RowType": "SummaryRow",
"Cells": [
{ "Value": "Total Revenue" },
{ "Value": "67500.00" }
]
}
]
}
]
}
Row Types
| RowType | Description |
|---|---|
Header | Column headers |
Section | Group of related rows (e.g., Revenue, Expenses) |
Row | Individual data row (account or contact) |
SummaryRow | Total/subtotal row |
API Patterns
Profit and Loss Report
# Current month P&L
curl -s -X GET "https://api.xero.com/api.xro/2.0/Reports/ProfitAndLoss?fromDate=2026-03-01&toDate=2026-03-31" \
-H "Authorization: Bearer ${ACCESS_TOKEN}" \
-H "xero-tenant-id: ${XERO_TENANT_ID}" \
-H "Accept: application/json"
# Year-to-date P&L
curl -s -X GET "https://api.xero.com/api.xro/2.0/Reports/ProfitAndLoss?fromDate=2026-01-01&toDate=2026-03-31" \
-H "Authorization: Bearer ${ACCESS_TOKEN}" \
-H "xero-tenant-id: ${XERO_TENANT_ID}" \
-H "Accept: application/json"
# P&L with tracking category filter
curl -s -X GET "https://api.xero.com/api.xro/2.0/Reports/ProfitAndLoss?fromDate=2026-03-01&toDate=2026-03-31&trackingCategoryID=${TRACKING_ID}&trackingOptionID=${OPTION_ID}" \
-H "Authorization: Bearer ${ACCESS_TOKEN}" \
-H "xero-tenant-id: ${XERO_TENANT_ID}" \
-H "Accept: application/json"
# P&L with monthly periods
curl -s -X GET "https://api.xero.com/api.xro/2.0/Reports/ProfitAndLoss?fromDate=2026-01-01&toDate=2026-03-31&periods=3&timeframe=MONTH" \
-H "Authorization: Bearer ${ACCESS_TOKEN}" \
-H "xero-tenant-id: ${XERO_TENANT_ID}" \
-H "Accept: application/json"
P&L Parameters:
| Parameter | Type | Description |
|---|---|---|
fromDate | string | Start date (YYYY-MM-DD) |
toDate | string | End date (YYYY-MM-DD) |
periods | integer | Number of comparison periods |
timeframe | string | MONTH, QUARTER, or YEAR |
trackingCategoryID | string | Filter by tracking category |
trackingOptionID | string | Filter by tracking option |
standardLayout | boolean | Use standard layout (true/false) |
paymentsOnly | boolean | Cash basis (true) or accrual (false) |
Balance Sheet Report
# Balance Sheet as of today
curl -s -X GET "https://api.xero.com/api.xro/2.0/Reports/BalanceSheet?date=2026-03-31" \
-H "Authorization: Bearer ${ACCESS_TOKEN}" \
-H "xero-tenant-id: ${XERO_TENANT_ID}" \
-H "Accept: application/json"
# Balance Sheet with comparison periods
curl -s -X GET "https://api.xero.com/api.xro/2.0/Reports/BalanceSheet?date=2026-03-31&periods=3&timeframe=MONTH" \
-H "Authorization: Bearer ${ACCESS_TOKEN}" \
-H "xero-tenant-id: ${XERO_TENANT_ID}" \
-H "Accept: application/json"
Balance Sheet Parameters:
| Parameter | Type | Description |
|---|---|---|
date | string | Report date (YYYY-MM-DD) |
periods | integer | Number of comparison periods |
timeframe | string | MONTH, QUARTER, or YEAR |
trackingCategoryID | string | Filter by tracking category |
standardLayout | boolean | Use standard layout |
paymentsOnly | boolean | Cash basis reporting |
Aged Receivables Report
# Aged Receivables as of today
curl -s -X GET "https://api.xero.com/api.xro/2.0/Reports/AgedReceivablesByContact?date=2026-03-31" \
-H "Authorization: Bearer ${ACCESS_TOKEN}" \
-H "xero-tenant-id: ${XERO_TENANT_ID}" \
-H "Accept: application/json"
# Aged Receivables for a specific contact
curl -s -X GET "https://api.xero.com/api.xro/2.0/Reports/AgedReceivablesByContact?date=2026-03-31&contactID=${CONTACT_ID}" \
-H "Authorization: Bearer ${ACCESS_TOKEN}" \
-H "xero-tenant-id: ${XERO_TENANT_ID}" \
-H "Accept: application/json"
# Aged Receivables with custom aging periods
curl -s -X GET "https://api.xero.com/api.xro/2.0/Reports/AgedReceivablesByContact?date=2026-03-31&fromDate=2025-01-01&toDate=2026-03-31" \
-H "Authorization: Bearer ${ACCESS_TOKEN}" \
-H "xero-tenant-id: ${XERO_TENANT_ID}" \
-H "Accept: application/json"
Aged Receivables Parameters:
| Parameter | Type | Description |
|---|---|---|
date | string | Report date (YYYY-MM-DD) |
contactID | string | Filter to specific contact |
fromDate | string | Start of aging period |
toDate | string | End of aging period |
Aged Payables Report
# Aged Payables as of today
curl -s -X GET "https://api.xero.com/api.xro/2.0/Reports/AgedPayablesByContact?date=2026-03-31" \
-H "Authorization: Bearer ${ACCESS_TOKEN}" \
-H "xero-tenant-id: ${XERO_TENANT_ID}" \
-H "Accept: application/json"
Trial Balance Report
# Trial Balance as of end of quarter
curl -s -X GET "https://api.xero.com/api.xro/2.0/Reports/TrialBalance?date=2026-03-31" \
-H "Authorization: Bearer ${ACCESS_TOKEN}" \
-H "xero-tenant-id: ${XERO_TENANT_ID}" \
-H "Accept: application/json"
# Trial Balance with payments only (cash basis)
curl -s -X GET "https://api.xero.com/api.xro/2.0/Reports/TrialBalance?date=2026-03-31&paymentsOnly=true" \
-H "Authorization: Bearer ${ACCESS_TOKEN}" \
-H "xero-tenant-id: ${XERO_TENANT_ID}" \
-H "Accept: application/json"
Trial Balance Parameters:
| Parameter | Type | Description |
|---|---|---|
date | string | Report date (YYYY-MM-DD) |
paymentsOnly | boolean | Cash basis (true) or accrual (false) |
Bank Summary Report
curl -s -X GET "https://api.xero.com/api.xro/2.0/Reports/BankSummary?fromDate=2026-03-01&toDate=2026-03-31" \
-H "Authorization: Bearer ${ACCESS_TOKEN}" \
-H "xero-tenant-id: ${XERO_TENANT_ID}" \
-H "Accept: application/json"
Common Workflows
MSP Monthly Financial Review
async function monthlyFinancialReview(month) {
const fromDate = `${month}-01`;
const lastDay = new Date(parseInt(month.split('-')[0]), parseInt(month.split('-')[1]), 0).get