Xero
Reads a Xero organisation’s chart of accounts, contacts, invoices and bills, bank transactions, payments, manual journals, journals and reports, so finance agents can answer from the books. It only reads. It reads in place, in your deployment; only ids, hashes and counts reach LightHouse.
At a glance
Section titled “At a glance”| Collector | Xero, version 1.0.0 |
|---|---|
| Reads | Xero: Xero Accounting API (the vendor's documentation) |
| Family | Finance |
| Kind | Accounting |
| Ways to connect | OAuth approval |
| Scopes |
|
| Read only | Yes, except: [object Object] |
| Vendor's API can move money | No |
| Personal data | Financial, Contact |
| Hosts it may contact | api.xero.com, identity.xero.com |
| Vendor API versions | Accounting API 2.0 (api.xro/2.0) |
| Lowest engine version | 0.46.0 |
What it reads
Section titled “What it reads”For each organisation you name (tenants, Xero’s tenant ids; with one
connected organisation it can be left out):
- The organisation: name, legal name, base currency, country, type, financial year end, short code.
- Chart of accounts, contacts, invoices and bills, bank transactions, payments and manual journals, each with its amounts and currency.
- Journals (where Xero has approved your app for them), by journal number.
- Reports: profit and loss, balance sheet, and aged receivables and payables
for the contacts you name in
aged_contacts. - Changes only: each list is asked
If-Modified-Sincethe start of the last successful pull, per organisation.
It does not read attachments, payroll or files.
How to connect
Section titled “How to connect”- In Xero, make your own app: a web app (consent gives a refresh token) or a custom connection (client credentials, one organisation).
- Grant it Xero’s
.readscopes only (below). - In LightHouse, open Setup and admin, Connectors, choose Xero, and name the organisations.
- Paste the client id, client secret and (for a web app) the refresh token. Your browser seals it to your deployment; LightHouse never sees it.
The credential is JSON in the variable the source names (AAL_XERO by
default): client_id, client_secret, and refresh_token for a web app.
Permissions
Section titled “Permissions”This collector is read-only: it sends GET requests, and one
POST https://identity.xero.com/connect/token to ask for an access token. Its
read-only test proves it on every change.
- Scopes it expects: for apps made since 2 March 2026 the granular ones:
accounting.invoices.read,accounting.payments.read,accounting.banktransactions.read,accounting.manualjournals.read,accounting.reports.profitandloss.read,accounting.reports.balancesheet.read,accounting.reports.aged.read; for older appsaccounting.transactions.readandaccounting.reports.read; withaccounting.contacts.read,accounting.settings.readand, where Xero has approved the app,accounting.journals.read. - Refused by the code: nothing. The check lists the scopes in the access
token and names any that is not a
.readscope (other thanopenid,profile,emailandoffline_access), with the wordsgranted scopes that write (...); this connector only reads: narrow the app to .read scopes. It still reads. The collector never sends anything butGETto Xero, so a wider scope is not used, but only narrowing the app removes it. - Not a funds-moving system: Xero records payments and bank transactions in the ledger; its API does not move money.
- Refresh token: Xero rotates it on every use and forgets an unused one after 60 days. The new one is written back to your own secret store in your deployment at once (not to Xero).
- Hosts: only
api.xero.comandidentity.xero.com, over https.
Limits
Section titled “Limits”- Accounting API 2.0.
- Xero allows 60 calls a minute and 5,000 a day per organisation. Requests are
paced a second apart, a 429 waits for
Retry-After, and a pull stops early, keeping what it has, when the day’s remaining calls fall under 100. - Lists are paged 100 at a time.
- A report whose scope is not granted is skipped, and so are journals if the app is not approved for them.
- With more than one organisation connected,
tenantsis required (Xero: name the organisations to read (tenants)).
Data handling
Section titled “Data handling”- Contacts, invoices and bills hold personal and financial data. Documents carry
the
labelyou give the source (defaultconfidential). - Content is read in place, in your deployment. LightHouse receives ids, hashes and counts, never the records, and never opens the credential.
- Errors carry a status and fixed text, never a provider’s body.
- The data is audit-ready for your own agents; nothing here certifies anyone against any regulation.
Troubleshooting
Section titled “Troubleshooting”| What you see | What it means | What to do |
|---|---|---|
Xero answered HTTP 401 (the app or its consent was refused) |
The client, secret or refresh token was refused | Check the app, or consent again |
granted scopes that write (...); this connector only reads: narrow the app to .read scopes |
The app holds a write scope | Narrow the app in Xero |
Xero: name the organisations to read (tenants) |
More than one organisation is connected | Name them in tenants |
Xero: 1 named organisation(s) are not connected to this app |
A tenant id is not connected | Connect the organisation to the app |
tenants and aged_contacts are Xero ids (GUIDs) |
An id is not a GUID | Use Xero’s tenant or contact id |
Xero answered HTTP 429 |
Rate limit | Nothing; the collector waits as Xero asks |
Certification
Section titled “Certification”Each entry is a run by Atlantic Agentic Labs, newest first. Only a run against the vendor’s sandbox or a client environment certifies a collector; a certification lasts six months, or less if the vendor publishes an API version the collector does not list. See How collectors are certified.
| Date | Collector | Engine | Vendor API | Method | Expires |
|---|---|---|---|---|---|
| 10 November 2026 | 1.0.0 | 0.46.0 | Accounting API 2.0 | Fixtures only: built, not certified | Not applicable |
Security posture
Section titled “Security posture”From the collector’s last scan on the default branch. What each line means, and what blocks a release: Security posture.
| Last scanned | 10 November 2026 |
|---|---|
| Critical findings | 0 |
| High findings | 0 |
| Medium findings | 0 |
| Low findings | 0 |
| Info findings | 0 |
| Release blocked | No |
| Network allow-list check | Pass |
| Read-only behavioural test | Pass |
| SBOM (CycloneDX) | Produced |
| Dependency licences | Pass |
| Scanners | bandit 1.9.4, semgrep 1.181.1, pip-audit 2.10.1, osv-scanner 2.7.0, cyclonedx-py 7.5.0, pip-licenses 5.5.5, gitleaks repository job aal-secrets, hosts_check tools/hosts_check.py, read-only test pytest -m read_only |