Xero integration | Zervanor
← All connectors

Xero

Also an agent tool
finance-billing

Xero Accounting API (api.xro/2.0) integration. OAuth 2.0 (authorization-code + offline refresh) with a mandatory per-call Xero-tenant-id header injected via oauth_config.extra_headers (ADR-033) — the connected organisation discovered at setup via GET https://api.xero.com/connections. Covers the full Accounting API JSON surface: Accounts, BankTransactions, BankTransfers, BatchPayments, BrandingThemes, Budgets, Contacts, ContactGroups, CreditNotes, Currencies, Employees, ExpenseClaims, Invoices, InvoiceReminders, Items, Journals, LinkedTransactions, ManualJournals, Organisation, Overpayments, Payments, PaymentServices, Prepayments, PurchaseOrders, Quotes, Receipts, RepeatingInvoices, Reports, TaxRates, TrackingCategories, Users, plus per-resource Attachments-list/History JSON sub-resources. Real signed webhooks (x-xero-signature HMAC-SHA256 base64, generic_hmac) for Contact/Invoice/CreditNote/Subscription create+update, with intent-to-receive (xero-01). Binary attachment upload/download + /pdf endpoints are deferred (xero-07); other Xero product APIs (Payroll, Files, Projects, Assets, etc.) live on separate base paths and are deferred to a future pack version (xero-10).

133 actions · 16 triggers

The Xero integration lets you connect Xero to your automations with 133 actions and 16 triggers — and every action is also a tool an AI agent can call. Examples: Get Organisation, Get Organisation Actions, List Accounts, Get Account, Create Account. No blank-canvas wiring — connect it and use it in your workflows.

Every action below is also a tool an AI agent can call — the same pack powers your workflows and your agents.

Triggers 16

Events in Xero that can start a workflow.

webhook

Contact Created

Fires when a contact is created in Xero (webhook eventCategory=CONTACT, eventType=CREATE). The signed POST carries a thin events[] reference (resourceId, resourceUrl, tenantId) — hydrate the full contact via get_contact / the resourceUrl. Intent-to-receive validation bodies (empty events[]) emit nothing (xero-01).

webhook

Contact Updated

Fires when a contact is updated in Xero (webhook eventCategory=CONTACT, eventType=UPDATE). Thin events[] reference; hydrate via get_contact / resourceUrl.

webhook

Invoice Created

Fires when an invoice is created in Xero (webhook eventCategory=INVOICE, eventType=CREATE). Thin events[] reference; hydrate via get_invoice / resourceUrl.

webhook

Invoice Updated

Fires when an invoice is updated in Xero (webhook eventCategory=INVOICE, eventType=UPDATE). Thin events[] reference; hydrate via get_invoice / resourceUrl.

webhook

Credit Note Created

Fires when a credit note is created in Xero (webhook eventCategory=CREDITNOTE, eventType=CREATE). Thin events[] reference; hydrate via get_credit_note / resourceUrl.

webhook

Credit Note Updated

Fires when a credit note is updated in Xero (webhook eventCategory=CREDITNOTE, eventType=UPDATE). Thin events[] reference; hydrate via get_credit_note / resourceUrl.

webhook

Subscription Created

Fires when an App Store subscription is created (webhook eventCategory=SUBSCRIPTION, eventType=CREATE). App Store partner apps only.

webhook

Subscription Updated

Fires when an App Store subscription is updated (webhook eventCategory=SUBSCRIPTION, eventType=UPDATE). App Store partner apps only.

polling

New or updated bank transactions

Polls Xero for bank transactions changed since the last run (no webhook for this resource).

polling

New or updated contacts

Polling fallback for the CONTACT webhook; polls contacts changed since the last run.

polling

New or updated credit notes

Polling fallback for the CREDITNOTE webhook; polls credit notes changed since the last run.

polling

New or updated invoices

Polling fallback for the INVOICE webhook; polls invoices changed since the last run.

polling

New or updated items

Polls Xero for inventory items changed since the last run (no webhook for this resource).

polling

New journals

Polls the general ledger using JournalNumber offset (no webhook for journals). Cursor = last JournalNumber seen; engine bootstraps at '' (Xero treats empty offset as start-from-0).

polling

New or updated manual journals

Polls Xero for manual journals changed since the last run (no webhook for this resource).

polling

New or updated payments

Polls Xero for payments changed since the last run (no webhook for this resource).

Actions 133

What Zervanor can do in Xero.

Reports12

GET

List Reports

List available reports (Xero: GET /Reports).

GET

Get Balance Sheet

Retrieve the Balance Sheet report (Xero: GET /Reports/BalanceSheet).

GET

Get Bank Summary

Retrieve the Bank Summary report (Xero: GET /Reports/BankSummary).

GET

Get Budget Summary

Retrieve the Budget Summary report (Xero: GET /Reports/BudgetSummary).

GET

Get Executive Summary

Retrieve the Executive Summary report (Xero: GET /Reports/ExecutiveSummary).

GET

Get Profit and Loss

Retrieve the Profit and Loss report (Xero: GET /Reports/ProfitAndLoss).

GET

Get Trial Balance

Retrieve the Trial Balance report (Xero: GET /Reports/TrialBalance).

GET

Get Aged Payables by Contact

Retrieve the Aged Payables by Contact report (Xero: GET /Reports/AgedPayablesByContact).

GET

Get Aged Receivables by Contact

Retrieve the Aged Receivables by Contact report (Xero: GET /Reports/AgedReceivablesByContact).

GET

List BAS/GST Reports

List published BAS/GST reports for AU/NZ/UK (Xero: GET /Reports/BASorGSTList).

GET

Get Published Report

Retrieve a specific published BAS/GST report by id (Xero: GET /Reports/{ReportID}).

GET

Get 1099 Report

Retrieve the US 1099 report (Xero: GET /Reports/TenNinetyNine).

Invoices9

GET

List Invoices

List invoices, paged (Xero: GET /Invoices). Supports Statuses and If-Modified-Since delta.

GET

Get Invoice

Retrieve a single invoice by GUID or InvoiceNumber (Xero: GET /Invoices/{InvoiceID}).

PUT

Create Invoice

Create invoices (Xero: PUT /Invoices). Body wraps { "Invoices": [ ... ] }.

POST

Update Invoice

Update a single invoice — status, void, etc. (Xero: POST /Invoices/{InvoiceID}). Body wraps { "Invoices": [ ... ] }.

POST

Email Invoice

Email an invoice to the contact (Xero: POST /Invoices/{InvoiceID}/Email). Empty body.

GET

Get Online Invoice URL

Retrieve the online-invoice URL for an invoice (Xero: GET /Invoices/{InvoiceID}/OnlineInvoice).

GET

List Invoice Attachments

List attachment metadata on an invoice — JSON metadata only, not the binary (Xero: GET /Invoices/{InvoiceID}/Attachments). Binary upload/download is deferred (xero-07).

GET

Get Invoice History

Retrieve history and notes for an invoice (Xero: GET /Invoices/{InvoiceID}/History).

PUT

Add Invoice History Note

Add a note to an invoice's history (Xero: PUT /Invoices/{InvoiceID}/History). Body wraps { "HistoryRecords": [ { "Details": "..." } ] }.

Contacts8

GET

List Contacts

List contacts, paged (Xero: GET /Contacts). Supports If-Modified-Since delta.

GET

Get Contact

Retrieve a single contact by GUID or ContactNumber (Xero: GET /Contacts/{ContactID}).

PUT

Create Contact

Create one or more contacts (Xero: PUT /Contacts). Body wraps { "Contacts": [ ... ] }.

POST

Update Contact

Update a single contact; archive via ContactStatus=ARCHIVED (Xero: POST /Contacts/{ContactID}). No hard delete (xero-05). Body wraps { "Contacts": [ ... ] }.

GET

Get Contact CIS Settings

Retrieve UK CIS settings for a contact (Xero: GET /Contacts/{ContactID}/CISSettings).

GET

List Contact Attachments

List attachment metadata on a contact — JSON metadata only (Xero: GET /Contacts/{ContactID}/Attachments). Binary upload/download is deferred (xero-07).

GET

Get Contact History

Retrieve history and notes for a contact (Xero: GET /Contacts/{ContactID}/History).

PUT

Add Contact History Note

Add a note to a contact's history (Xero: PUT /Contacts/{ContactID}/History). Body wraps { "HistoryRecords": [ { "Details": "..." } ] }.

ContactGroups7

GET

List Contact Groups

List contact groups (Xero: GET /ContactGroups).

GET

Get Contact Group

Retrieve a single contact group (Xero: GET /ContactGroups/{ContactGroupID}).

PUT

Create Contact Group

Create a contact group (Xero: PUT /ContactGroups). Body wraps { "ContactGroups": [ ... ] }.

POST

Update Contact Group

Rename a contact group or set Status=DELETED (Xero: POST /ContactGroups/{ContactGroupID}). Body wraps { "ContactGroups": [ ... ] }.

PUT

Add Contacts to Group

Add contacts to a contact group (Xero: PUT /ContactGroups/{ContactGroupID}/Contacts). Body wraps { "Contacts": [ ... ] }.

DELETE

Remove All Contacts from Group

Remove all contacts from a contact group (Xero: DELETE /ContactGroups/{ContactGroupID}/Contacts).

DELETE

Remove Contact from Group

Remove a single contact from a contact group (Xero: DELETE /ContactGroups/{ContactGroupID}/Contacts/{ContactID}).

CreditNotes6

GET

List Credit Notes

List credit notes, paged (Xero: GET /CreditNotes).

GET

Get Credit Note

Retrieve a single credit note (Xero: GET /CreditNotes/{CreditNoteID}).

PUT

Create Credit Note

Create credit notes (Xero: PUT /CreditNotes). Body wraps { "CreditNotes": [ ... ] }.

POST

Update Credit Note

Update a credit note (Xero: POST /CreditNotes/{CreditNoteID}). Body wraps { "CreditNotes": [ ... ] }.

PUT

Allocate Credit Note

Allocate a credit note to an invoice (Xero: PUT /CreditNotes/{CreditNoteID}/Allocations). Body wraps { "Allocations": [ ... ] }.

DELETE

Delete Credit Note Allocation

Delete a credit note allocation (Xero: DELETE /CreditNotes/{CreditNoteID}/Allocations/{AllocationID}).

TrackingCategories6

GET

List Tracking Categories

List tracking categories and their options (Xero: GET /TrackingCategories).

GET

Get Tracking Category

Retrieve a single tracking category (Xero: GET /TrackingCategories/{TrackingCategoryID}).

PUT

Create Tracking Category

Create a tracking category (Xero: PUT /TrackingCategories). Body wraps { "TrackingCategories": [ ... ] }.

POST

Update Tracking Category

Update or delete a tracking category via Status=DELETED (Xero: POST /TrackingCategories/{TrackingCategoryID}). Body wraps { "TrackingCategories": [ ... ] }.

PUT

Add Tracking Option

Add an option to a tracking category (Xero: PUT /TrackingCategories/{TrackingCategoryID}/Options). Body wraps { "Options": [ ... ] }.

POST

Update Tracking Option

Update or delete a tracking option via Status=DELETED (Xero: POST /TrackingCategories/{TrackingCategoryID}/Options/{OptionID}). Body wraps { "Options": [ ... ] }.

Accounts5

GET

List Accounts

List the chart of accounts (Xero: GET /Accounts).

GET

Get Account

Retrieve a single account by GUID (Xero: GET /Accounts/{AccountID}).

PUT

Create Account

Create a new account in the chart of accounts (Xero: PUT /Accounts). Body wraps the collection: { "Accounts": [ ... ] }.

POST

Update Account

Update an existing account (Xero: POST /Accounts/{AccountID}). Body wraps the collection: { "Accounts": [ ... ] }.

DELETE

Delete Account

Delete an account, only if it has no transactions (Xero: DELETE /Accounts/{AccountID}).

Items5

GET

List Items

List inventory items (Xero: GET /Items).

GET

Get Item

Retrieve a single item by GUID or Code (Xero: GET /Items/{ItemID}).

PUT

Create Item

Create items (Xero: PUT /Items). Body wraps { "Items": [ ... ] }.

POST

Update Item

Update a single item (Xero: POST /Items/{ItemID}). Body wraps { "Items": [ ... ] }.

DELETE

Delete Item

Delete an item (Xero: DELETE /Items/{ItemID}).

LinkedTransactions5

GET

List Linked Transactions

List linked transactions / billable expenses (Xero: GET /LinkedTransactions).

GET

Get Linked Transaction

Retrieve a single linked transaction (Xero: GET /LinkedTransactions/{LinkedTransactionID}).

PUT

Create Linked Transaction

Create a linked transaction (Xero: PUT /LinkedTransactions). Body wraps { "LinkedTransactions": [ ... ] }.

POST

Update Linked Transaction

Update a linked transaction (Xero: POST /LinkedTransactions/{LinkedTransactionID}). Body wraps { "LinkedTransactions": [ ... ] }.

DELETE

Delete Linked Transaction

Delete a linked transaction (Xero: DELETE /LinkedTransactions/{LinkedTransactionID}).

Payments5

GET

List Payments

List payments (Xero: GET /Payments).

GET

Get Payment

Retrieve a single payment (Xero: GET /Payments/{PaymentID}).

PUT

Create Payment

Create a single payment (Xero: PUT /Payments). Body wraps { "Payments": [ ... ] }.

POST

Create Payments

Create multiple payments (Xero: POST /Payments). Body wraps { "Payments": [ ... ] }.

POST

Delete Payment

Reverse/delete a payment by setting Status=DELETED (Xero: POST /Payments/{PaymentID}). Body wraps { "Payments": [ ... ] }.

BankTransactions4

GET

List Bank Transactions

List bank transactions, paged (Xero: GET /BankTransactions).

GET

Get Bank Transaction

Retrieve a single bank transaction (Xero: GET /BankTransactions/{BankTransactionID}).

PUT

Create Bank Transaction

Create spend/receive money bank transactions (Xero: PUT /BankTransactions). Body wraps { "BankTransactions": [ ... ] }.

POST

Create or Update Bank Transactions

Create or update bank transactions (Xero: POST /BankTransactions). Body wraps { "BankTransactions": [ ... ] }.

BatchPayments4

GET

List Batch Payments

List batch payments (Xero: GET /BatchPayments).

GET

Get Batch Payment

Retrieve a single batch payment (Xero: GET /BatchPayments/{BatchPaymentID}).

PUT

Create Batch Payment

Create a batch payment (Xero: PUT /BatchPayments). Body wraps { "BatchPayments": [ ... ] }.

POST

Delete Batch Payment

Reverse/delete a batch payment by setting Status=DELETED (Xero: POST /BatchPayments/{BatchPaymentID}). Body wraps { "BatchPayments": [ ... ] }.

Employees4

GET

List Employees

List employees in the accounting context (Xero: GET /Employees).

GET

Get Employee

Retrieve a single employee (Xero: GET /Employees/{EmployeeID}).

PUT

Create Employee

Create employees (Xero: PUT /Employees). Body wraps { "Employees": [ ... ] }.

POST

Create or Update Employees

Create or update employees (Xero: POST /Employees). Body wraps { "Employees": [ ... ] }.

ExpenseClaims4

GET

List Expense Claims

List expense claims (Xero: GET /ExpenseClaims).

GET

Get Expense Claim

Retrieve a single expense claim (Xero: GET /ExpenseClaims/{ExpenseClaimID}).

PUT

Create Expense Claim

Create expense claims (Xero: PUT /ExpenseClaims). Body wraps { "ExpenseClaims": [ ... ] }.

POST

Update Expense Claim

Update an expense claim (Xero: POST /ExpenseClaims/{ExpenseClaimID}). Body wraps { "ExpenseClaims": [ ... ] }.

ManualJournals4

GET

List Manual Journals

List manual journals, paged (Xero: GET /ManualJournals).

GET

Get Manual Journal

Retrieve a single manual journal (Xero: GET /ManualJournals/{ManualJournalID}).

PUT

Create Manual Journal

Create manual journals (Xero: PUT /ManualJournals). Body wraps { "ManualJournals": [ ... ] }.

POST

Update Manual Journal

Update a single manual journal (Xero: POST /ManualJournals/{ManualJournalID}). Body wraps { "ManualJournals": [ ... ] }.

Overpayments4

GET

List Overpayments

List overpayments, paged (Xero: GET /Overpayments).

GET

Get Overpayment

Retrieve a single overpayment (Xero: GET /Overpayments/{OverpaymentID}).

PUT

Allocate Overpayment

Allocate an overpayment to an invoice (Xero: PUT /Overpayments/{OverpaymentID}/Allocations). Body wraps { "Allocations": [ ... ] }.

DELETE

Delete Overpayment Allocation

Delete an overpayment allocation (Xero: DELETE /Overpayments/{OverpaymentID}/Allocations/{AllocationID}).

Prepayments4

GET

List Prepayments

List prepayments, paged (Xero: GET /Prepayments).

GET

Get Prepayment

Retrieve a single prepayment (Xero: GET /Prepayments/{PrepaymentID}).

PUT

Allocate Prepayment

Allocate a prepayment to an invoice (Xero: PUT /Prepayments/{PrepaymentID}/Allocations). Body wraps { "Allocations": [ ... ] }.

DELETE

Delete Prepayment Allocation

Delete a prepayment allocation (Xero: DELETE /Prepayments/{PrepaymentID}/Allocations/{AllocationID}).

PurchaseOrders4

GET

List Purchase Orders

List purchase orders, paged (Xero: GET /PurchaseOrders).

GET

Get Purchase Order

Retrieve a single purchase order by GUID or PurchaseOrderNumber (Xero: GET /PurchaseOrders/{PurchaseOrderID}).

PUT

Create Purchase Order

Create purchase orders (Xero: PUT /PurchaseOrders). Body wraps { "PurchaseOrders": [ ... ] }.

POST

Update Purchase Order

Update a single purchase order (Xero: POST /PurchaseOrders/{PurchaseOrderID}). Body wraps { "PurchaseOrders": [ ... ] }.

Quotes4

GET

List Quotes

List quotes, paged (Xero: GET /Quotes).

GET

Get Quote

Retrieve a single quote by GUID or QuoteNumber (Xero: GET /Quotes/{QuoteID}).

PUT

Create Quote

Create quotes (Xero: PUT /Quotes). Body wraps { "Quotes": [ ... ] }.

POST

Update Quote

Update a single quote (Xero: POST /Quotes/{QuoteID}). Body wraps { "Quotes": [ ... ] }.

Receipts4

GET

List Receipts

List draft expense receipts (Xero: GET /Receipts).

GET

Get Receipt

Retrieve a single receipt (Xero: GET /Receipts/{ReceiptID}).

PUT

Create Receipt

Create receipts (Xero: PUT /Receipts). Body wraps { "Receipts": [ ... ] }.

POST

Update Receipt

Update a receipt (Xero: POST /Receipts/{ReceiptID}). Body wraps { "Receipts": [ ... ] }.

RepeatingInvoices4

GET

List Repeating Invoices

List repeating invoice templates (Xero: GET /RepeatingInvoices).

GET

Get Repeating Invoice

Retrieve a single repeating invoice (Xero: GET /RepeatingInvoices/{RepeatingInvoiceID}).

PUT

Create Repeating Invoice

Create repeating invoices (Xero: PUT /RepeatingInvoices). Body wraps { "RepeatingInvoices": [ ... ] }.

POST

Create or Update Repeating Invoices

Create or update repeating invoices (Xero: POST /RepeatingInvoices). Body wraps { "RepeatingInvoices": [ ... ] }.

BankTransfers3

GET

List Bank Transfers

List bank transfers (Xero: GET /BankTransfers).

GET

Get Bank Transfer

Retrieve a single bank transfer (Xero: GET /BankTransfers/{BankTransferID}).

PUT

Create Bank Transfer

Create a bank transfer (Xero: PUT /BankTransfers). Body wraps { "BankTransfers": [ ... ] }.

TaxRates3

GET

List Tax Rates

List tax rates (Xero: GET /TaxRates).

PUT

Create Tax Rate

Create tax rates (Xero: PUT /TaxRates). Body wraps { "TaxRates": [ ... ] }.

POST

Create or Update Tax Rates

Create or update tax rates, including status changes (Xero: POST /TaxRates). Body wraps { "TaxRates": [ ... ] }.

BrandingThemes2

GET

List Branding Themes

List branding themes (Xero: GET /BrandingThemes).

GET

Get Branding Theme

Retrieve a single branding theme (Xero: GET /BrandingThemes/{BrandingThemeID}).

Budgets2

GET

List Budgets

List budgets (Xero: GET /Budgets).

GET

Get Budget

Retrieve a single budget with its budget lines (Xero: GET /Budgets/{BudgetID}).

Currencies2

GET

List Currencies

List currencies for the organisation (Xero: GET /Currencies).

PUT

Create Currency

Add a currency to the organisation (Xero: PUT /Currencies). Body wraps { "Currencies": [ ... ] }.

Journals2

GET

List Journals

List general-ledger journals, read-only (Xero: GET /Journals).

GET

Get Journal

Retrieve a single journal by GUID or JournalNumber (Xero: GET /Journals/{JournalID}).

Organisation2

GET

Get Organisation

Retrieve the connected organisation's details (Xero: GET /Organisation). Single object; parameterless beyond the required Xero-tenant-id header. Safe identity/connectivity probe — validates both the OAuth token and the tenant header in one call. Connector READ test target.

GET

Get Organisation Actions

List the allowed actions (entitlements) for the connected organisation (Xero: GET /Organisation/Actions).

PaymentServices2

GET

List Payment Services

List payment services; requires the paymentservices scope (Xero: GET /PaymentServices).

PUT

Create Payment Service

Create a payment service (Xero: PUT /PaymentServices). Body wraps { "PaymentServices": [ ... ] }.

Users2

GET

List Users

List users in the organisation (Xero: GET /Users).

GET

Get User

Retrieve a single user (Xero: GET /Users/{UserID}).

InvoiceReminders1

GET

Get Invoice Reminders Setting

Retrieve the organisation's invoice-reminder on/off setting (Xero: GET /InvoiceReminders/Settings).

Automations using Xero

Build your own automation with Xero in the visual builder.

Frequently asked questions

What can I automate with Xero?

133 actions are available — for example: Get Organisation, Get Organisation Actions, List Accounts, Get Account, Create Account, and more.

Which Xero events can start a workflow?

16 triggers — for example: Contact Created, Contact Updated, Invoice Created, Invoice Updated.

Can Xero be used as an AI agent tool?

Yes. Every Xero action automatically becomes a tool an AI agent can call — the same pack powers both your workflows and your agents.

How is the Xero integration modelled?

Xero is modelled as a versioned connector pack, and the steps that need reasoning fall to first-party agents hosted in the same runtime as the workflows.