# Xero

> Xero: what the collector reads, how to connect it, its permissions, its certification by Atlantic Agentic Labs and its security posture.

Built, not certified Built and tested against recorded and synthetic responses (version 1.0.0, 10 November 2026). Not yet run against the vendor's sandbox or a client environment.

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

| Collector                   | Xero, version `1.0.0`                                                                                                                                                                                                                                                                                                                                                                                |
| --------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Reads                       | Xero: Xero Accounting API ([the vendor's documentation](https://developer.xero.com/documentation/api/accounting/overview))                                                                                                                                                                                                                                                                           |
| Family                      | Finance                                                                                                                                                                                                                                                                                                                                                                                              |
| Kind                        | Accounting                                                                                                                                                                                                                                                                                                                                                                                           |
| Ways to connect             | OAuth approval                                                                                                                                                                                                                                                                                                                                                                                       |
| Scopes                      | - Read: `accounting.contacts.read`, `accounting.settings.read`, `accounting.invoices.read`, `accounting.payments.read`, `accounting.banktransactions.read`, `accounting.manualjournals.read`, `accounting.reports.profitandloss.read`, `accounting.reports.balancesheet.read`, `accounting.reports.aged.read`, `accounting.journals.read`, `accounting.transactions.read`, `accounting.reports.read` |
| 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

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-Since` the start of the last successful pull, per organisation.

It does not read attachments, payroll or files.

## How to connect

1. In Xero, make your own app: a web app (consent gives a refresh token) or a custom connection (client credentials, one organisation).
2. Grant it Xero’s `.read` scopes only (below).
3. In LightHouse, open **Setup and admin, Connectors**, choose **Xero**, and name the organisations.
4. 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

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 apps `accounting.transactions.read` and `accounting.reports.read`; with `accounting.contacts.read`, `accounting.settings.read` and, 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 `.read` scope (other than `openid`, `profile`, `email` and `offline_access`), with the words `granted scopes that write (...); this connector only reads: narrow the app to .read scopes`. It still reads. The collector never sends anything but `GET` to 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.com` and `identity.xero.com`, over https.

## 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, `tenants` is required (`Xero: name the organisations to read (tenants)`).

## Data handling

- Contacts, invoices and bills hold personal and financial data. Documents carry the `label` you give the source (default `confidential`).
- 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

| 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

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](/collectors/certification/).

| 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

From the collector’s last scan on the default branch. What each line means, and what blocks a release: [Security posture](/collectors/security/).

| 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 |

Source: https://docs.atlanticagenticlabs.com/collectors/catalogue/xero/
