Capability library / Application package

Xero package v1.1.0

Xero: read contacts, invoices, payments and bank transactions, and create draft or approved invoices and purchase bills.

Review state: Reviewed · Distributable: yes, digest matches the release manifest

This page describes AAES Govern’s controls. AAES Operate has private-work permissions, operational reviews and recorded-spend limits; it does not include Govern. About AAES Govern

Before you enable this package

Keep api.xero.com. Configure xero-tenant-id in trusted deployment settings for every request; this package injects Authorization only.

Read each action's effects and exclusions below. Before installation, also read the complete package requirements, including credential issuance, scope, expiry, and provider permissions. These are deployment prerequisites, not capabilities this package supplies.

Capabilities (5)

Each capability below is one registered operation. The complete package JSON includes its exact network destination allowlist. The repository stores it at packs/xero.json and embeds a copy in the release binary.

Versions. This package is version 1.1.0. Its capabilities carry their own version numbers: 4 at version 1.0.0, 1 at version 1.1.0, as shown on each capability below.

Risk tiers. R0 is the minimum for reads. R2 is the minimum for write, create, update, execute, and invoke. R3 is the minimum for delete, send, pay, deploy, approve, share, and transfer. Operators can raise these levels. A minimum tier does not measure the operation's business or confidentiality risk.

On supported execution paths routed through AAES Govern, the R3 actions listed below require approval by an authorized person. Bypass paths and observation-only registrations are outside that guarantee. A provider's restoration feature does not remove this approval requirement. A provider-side approval, such as approving a GitLab merge request, is also separate from AAES Govern human approval. The capability matrix shows which execution paths are implemented, restricted to lab use, or refused at startup. Live compatibility must be tested in your environment.

Field guide. Endpoint is the service address and request method. Connector is the adapter that makes the call. Custody describes how the credential is held; the credential reference identifies the value to resolve. Data class sets handling requirements: pii means personal data, financial means financial records, and internal means internal organizational data.

xero.contacts.read v1.0.0R0

Kind
tool
Action
read
Endpoint
GET https://api.xero.com/api.xro/2.0/Contacts
Connector
http
Custody
customer_vault
Credential ref
secret-ref-xero-access-token
Data class
pii

Read contacts.

Read the organisation's contacts collection: customers and suppliers with names, addresses, emails and phones, which are personal data. The collection supports where-filtering and pagination.

xero.invoices.read v1.0.0R0

Kind
tool
Action
read
Endpoint
GET https://api.xero.com/api.xro/2.0/Invoices
Connector
http
Custody
customer_vault
Credential ref
secret-ref-xero-access-token
Data class
financial

Read invoices.

Read the invoices collection: sales invoices and purchase bills with line items, amounts, tax and status — financial data.

xero.payments.read v1.0.0R0

Kind
tool
Action
read
Endpoint
GET https://api.xero.com/api.xro/2.0/Payments
Connector
http
Custody
customer_vault
Credential ref
secret-ref-xero-access-token
Data class
financial

Read payments.

Read the payments collection: payments recorded against invoices and credit notes, with amounts and bank accounts — financial data.

xero.banktransactions.read v1.0.0R0

Kind
tool
Action
read
Endpoint
GET https://api.xero.com/api.xro/2.0/BankTransactions
Connector
http
Custody
customer_vault
Credential ref
secret-ref-xero-access-token
Data class
financial

Read bank transactions.

Read the bank transactions collection: spent and received money transactions on the organisation's bank accounts — financial data.

xero.invoices.create v1.1.0R3

Kind
tool
Actions
create, approve
Endpoint
PUT https://api.xero.com/api.xro/2.0/Invoices
Connector
http
Custody
customer_vault
Credential ref
secret-ref-xero-access-token
Data class
financial

Create invoices.

Create one or more invoices (this pack registers PUT creation on the collection, per Xero's OpenAPI specification).

The request body is caller-controlled and chooses the invoice status: DRAFT is an unposted working document, but AUTHORISED is a posted ledger document — approved on creation — and the endpoint cannot enforce a draft-only choice, so unrestricted creation on this route includes approving the created sales invoice or purchase bill. The actions are create plus approve at the minimum R3 tier (approve is one of the designated actions requiring human approval); enforce any draft-only restriction separately.

Creation writes the document into the ledger and moves no money and sends nothing; recording a payment against it would be a financial write this pack leaves out (a Xero Payment is a ledger record, not an instruction that moves funds), and emailing an invoice would carry send at R3 — this pack registers neither.

Credential reference

The credential field names a reference rather than containing credential material. Packs are designed not to contain secrets; the format checks cover only known credential formats and cannot prove that arbitrary text contains no secrets. Installing a package registers its capabilities. Configure the provider credentials, endpoints, and network access, then test the integration in your environment before enabling it.

Reference
secret-ref-xero-access-token
Custody
customer_vault
Injection
header (Authorization)

Configure the value and injection format specified in the package. Assign responsibility for credential rotation and revocation, restrict provider permissions, and keep credential material out of logs and responses.

Complete credential requirements

An OAuth2 access token for the Xero Accounting API, held in the client's own secret manager under this reference. Xero issues tokens through the OAuth2 authorization-code flow (authorization endpoint login.xero.com, token endpoint identity.xero.com); a refresh token is issued only if the app requested the offline_access scope at authorization, so the external token process's authorization must include it. Per Xero's documented expiry times, the access token lives 30 minutes and the refresh token 60 days, and Xero rotates the refresh token on every refresh — the refresh response carries a new refresh token that must be saved in place of the old.

Exactly one external token process therefore owns the refresh path: it refreshes, stores the FRESH access token under this reference, and keeps the rotating refresh token and the app's client credentials to itself — the executor and the agent never see them, and this pack does not store one. The consequence of splitting the refresh path is real but not instantaneous: Xero documents a 30-minute grace period after each refresh during which the previous refresh token still works (so a client that lost the response can retry) — two processes refreshing independently may both succeed within that window, and invalidation follows when the grace period ends, at which point one side's token chain is dead and re-authorization is required.

Treat any second refresh process as a wiring fault regardless. Revocation is documented and active: POST identity.xero.com/connect/revocation with the refresh token revokes it and removes the app's connections, and a single tenant connection can be dropped with DELETE api.xero.com/connections/{connectionId}; an already-issued access token otherwise stands until its 30-minute expiry. The stored material must be the complete Authorization header value (scheme included: 'Bearer <access-token>'). Choose the least-privilege scopes the spec names for these endpoints: accounting.contacts.read, accounting.transactions.read, and accounting.transactions for invoice creation.

At execution time the resolved bearer material exists in the executor process's memory for the moment of injection only — the deployment owns the executor's memory, log, trace and crash hygiene; the agent never receives it.

Resources

  • xero-organisation (api, financial): https://api.xero.com/api.xro/2.0

Technical package and review record

Complete provider requirements and exclusions

The registered host api.xero.com is Xero's single shared API host, and the registered paths and methods are from Xero's official Xero-OpenAPI specification: collection GETs on /Contacts, /Invoices, /Payments and /BankTransactions, and invoice creation as PUT /Invoices — the narrower fact is that THIS PACK registers PUT creation; Xero's specification also offers POST create-or-update on the same collection, which this pack does not register. Every call also requires the xero-tenant-id header, which the same specification declares a required header; this pack registers the Authorization injection only, so the tenant id is connector or deployment configuration, set by the operator — never supplied by the agent.

The developer.xero.com documentation pages require a JavaScript browser to render; this review verified the operations, methods, scopes and required headers against the official spec instead, and the OAuth lifecycle claims against Xero's rendered OAuth 2.0 auth-flow guide. Invoice creation is declared as create plus approve at the minimum R3 tier: Xero invoices can be created in DRAFT or AUTHORISED status from the caller-controlled request body, an AUTHORISED invoice is a posted ledger document — an approved financial record, not a draft — and the registered endpoint cannot enforce a draft-only choice, so unrestricted creation on this route includes approval of the created document.

An installer's intention to request only DRAFT is not a restriction the pack can enforce. This pack does not register payment creation (see below), bank transaction creation, invoice email, attachments, history-and-notes writes, updates, or deletes — and note what a payment is here: a Xero Payment records a payment against an invoice in the ledger, a bookkeeping entry, not an instruction that moves funds; actual money movement happens through the organisation's bank outside this API.

Recording such a payment is still a financial write this pack leaves out. AAES has not been certified by Xero; the endpoints here are configuration to review and test; the vendor has not endorsed it.

Effect-handle equivalence for xero.invoices.create@1.1.0: effect_id_body_pointer /Invoices/0/InvoiceID makes AAES capture InvoiceID from the single invoice in the same 2xx creation response. Digest mode keeps the financial response body from the agent, the receipt digest covers the original bounded body, and effect_id_source records body.Invoices[0].InvoiceID beside the value. The body declaration is authoritative: an unexpected effect-ID header is logged as ignored and is never used or merged. Capture requires exactly one array element and a canonical UUID. A missing, malformed, over-long or non-UUID value, an oversized body, multiple invoices, or validation warnings or errors each produce a post-dispatch refusal requiring reconciliation, never a silent success or an automatic retry with a new key.

Established from the reviewed OpenAPI specification: createInvoices describes its 200 response as a newly created Invoice; InvoiceID is described as a Xero-generated unique identifier with UUID format; InvoiceNumber is described as a unique alphanumeric code that is auto-generated when omitted; GET /Invoices/{InvoiceID} retrieves a specific invoice; and the required xero-tenant-id header selects the tenant. These statements establish provider assignment, UUID shape and a readback route at specification level. They do not prove identifier stability over time, uniqueness within the tenant, or live create-versus-update behavior. Stability and tenant-scoped uniqueness remain asserted properties requiring sector/provider reviewer confirmation.

A complete equivalence argument also requires the InvoiceID to be minted by this call. The response schema has no create-versus-update marker. If PUT updates in place when InvoiceNumber or InvoiceID matches an existing invoice, extraction alone cannot distinguish that update from creation. A Xero-specific request adapter at the gateway decision boundary must pin a fresh, client-generated, unique InvoiceNumber into the single invoice for each intent and seal that exact payload before dispatch. Asserted for this design and requiring sector/provider reviewer confirmation: Xero enforces per-organisation InvoiceNumber uniqueness, so a retry with the same pinned number updates that invoice and returns the same InvoiceID. The existing scalar request contract cannot express a generated nested field, and changing the payload in the connector after the intent is sealed would break the intent binding. Pinning therefore remains outside this connector change. Until that adapter and the provider review exist, minted-by-this-call is an unproven equivalence property, not a claim made by this pack.

Versioning: pack version 1.1.0 is the release in which xero.invoices.create moved to 1.1.0 (the effect_id_body_pointer declaration above); the other capabilities are unchanged since 1.0.0 and keep it, because a capability's version is the pack version in which its registration last changed.

Download the complete package JSON for exact network allowlists, credential requirements, exclusions, and setup notes. Read these requirements before installation.

The full documentation review record is supplied in the evaluation package. The evaluation package runs in your environment and comes only with the paid design partnership. This page reproduces the source links and review block; the full record is available for evaluation. Discuss a design partnership to inspect it before installation.

Review block

This section reproduces the review block recorded in the pack file. The evidence and approval record is separate: for a reviewed pack, it is in the evaluation materials and in the release binary's embedded assets.

Review completed: 2026-10-22

2 sources, retrieved 2026-09-21

Current documentation links are navigation aids. They do not change the package, its historical sources or its review date. Review dates describe a documentation review, not a live integration test. No package is provider-endorsed or yet tested against a live provider tenant.

Release identity

SHA-256 of the pack file bytes: e3a2a0b64d04dcedd451e378e4ae481d6553a1b109ae621c6c32d5d647d38a97

Distributable: yes, digest matches the release manifest. Editing a package changes its release identity. A deployment plan checks its own file digests; it does not restore reviewed status or authenticate approval.