All notable changes to this package are documented here.
Xero updated the Accounting OpenAPI spec (16.1.0 to 17.0.0), adding two new fields to Item. Additive, no change to existing method signatures.
Item:getQuantityAvailable(),getQuantityOnBackOrder()(read only, reported by Xero alongsideQuantityOnHand)
Xero updated the Accounting OpenAPI spec (16.0.0 to 16.1.0), adding a new field and new bank transfer operations. These are additive and do not change existing method signatures.
Invoice,CreditNote,Payment,Overpayment,Prepayment:getUpdatedDateUTCString(), an ISO-8601 formatted version ofUpdatedDateUTCBankTransfer:getStatus(),getFromTracking(),getToTracking()(tracking categories on the source and destination accounts)BankTransfers:delete($id)to soft-delete a single transfer,deleteMany($ids)to soft-delete several at once, andincludeDeleted()to include deleted transfers inget()
New endpoints and resources. These are additive and do not change existing method signatures.
Accounting:Budgets:budgets()withget(),find(), anddateFrom/dateTofilters, underaccounting.budgets.readInvoices:email()to send an invoice to the contact;onlineInvoiceUrl()for the shareable link (both on theInvoicesresource and a boundInvoice)Allocationson credit notes, overpayments, and prepayments (create withPUT, remove withDELETE)attachments()on accounts, bank transactions, bank transfers, contacts, quotes, and repeating invoices (list, download by file name or attachment id, create, update)history()on contacts, bank transfers, expense claims, quotes, overpayments, prepayments, and repeating invoicesLinkedTransactions:find(),update(), anddelete()by idTrackingCategories: add, rename, and delete optionsUsers::find()by id,Organisations::actions(), and contact and organisation CIS settings readsBrandingThemes: list and add payment servicesAccounting::setup()to post the conversion date and opening balances
Payroll AU:LeaveApplications::v2(), which also returns pending leave requests
Payroll NZ:Deductions,EarningsRates, andSuperannuationspay items (list, find, create)PaySlips: list by pay run, find by id, and update line items
Payroll UK:Deductions,EarningsRates,Benefits, andEarningsOrderspay items (EarningsOrdersis read-only)- employee opening balances:
openingBalances(),createOpeningBalances(),updateOpeningBalances() - statutory sick leave:
statutoryLeaves()->findSick()andcreateSick()
Payroll NZandPayroll UK:- timesheet lines: create, update, and delete a line on a timesheet
- employee pay template earnings: list, create, update, delete, and bulk create
- CI audit workflow (
.github/workflows/audit.yml): downloads the latest Xero OpenAPI specs fromXeroAPI/Xero-OpenAPIon every push and PR, then runs.github/scripts/audit.py(endpoint coverage) and.github/scripts/schema_audit.py(model field audit). Any finding fails the build; there is zero tolerance for spec drift.
These are bug fixes against the official Xero OpenAPI specs. The affected calls previously 404'd, returned empty data, or sent a payload Xero ignores. They change method signatures and serialized payloads, so they are breaking. See UPGRADE.md for the full list of affected methods.
AppStore: every call now goes tohttps://api.xero.com/appstore/2.0/...(washttps://api.xero.com/subscriptions/..., a 404 for every request)AppStore:Subscriptionmodel rewritten to spec fields (id,organisationId,status,startDate,currentPeriodEnd,endDate,testMode,plans); removed guessedSubscriptionID/PlanID/itemsfieldsAppStore:UsageRecordmodel rewritten to spec fields (usageRecordId,subscriptionId,quantity,recordedAt, etc.);UsageRecordPayloadnow sendsquantityandtimestamp(wasquantity,startDate,endDate)Files:Filemodel fields corrected to spec casing (CreatedDateUtc/UpdatedDateUtc);Usermodel added; upload changed tomultipart/form-data(was a raw body that Xero rejected with 415);Associationsresponse shapes fixed from guessedItems-wrapper to bare arrayAssets:Assetmodel rewritten to spec camelCase fields;AssetTypeandSettingsmodels rewritten to spec fields; list responses now readitems(wasItems)Projects:Projectmodel rewritten to spec camelCase fields;TaskandTimeEntrymodels rewritten;ProjectUsermodel rewritten to spec fields (userId,name,email)Finance: removedAccountingActivitiesmodule (Xero removed this API from the OpenAPI spec in February 2026);BankStatementAccountingresponse shape fixed;FinancialStatementsmodels (BalanceSheet,ProfitAndLoss,Cashflow,TrialBalance,IncomeByContact) rewritten to spec fieldsFinance:bankStatementAccounting()now calls/finance.xro/1.0/BankStatementsPlus/statementswith the documentedBankAccountID/FromDate/ToDate/SummaryOnlyparametersPayroll NZandPayroll UK:Timesheets: revert now callsRevertToDraft(wasRevert, a 404); removed the phantomupdate(); UK gaineddelete()Employees: update is nowPUT(wasPOST); request/response bodies are bare camelCase;emailreplacesEmailAddress; removed the non-existentStatusfieldEmployees: removed the phantomemployment()reader (the API only supportsPOST .../Employmentto create, noGET)PayRuns: request/response bodies are bare camelCase; full schema exposed; addedpaymentDate()builder for createPayRunCalendars: response unwraps from camelCasepayRunCalendars/payRunCalendar; full schema exposed
Payroll UK:Employees: payment methods endpoint is/PaymentMethods(plural, was singular)Employees: leave types now returnEmployeeLeaveType(was incorrectly mapped toLeaveType)Settings:trackingCategories()returns the singletrackingCategoriesobject;Reimbursementcorrected toaccountID/currentRecord;statutoryLeaveSummary()returns a collection ofEmployeeStatutoryLeaveSummaryPayslips: unwrap frompaySlips/paySlip; corrected to the real schema; payslip access hits the realGET /Payslips?PayRunID=andGET /Payslips/{id}endpoints
Payroll NZ:LeaveTypes: unwraps from camelCaseleaveTypes/leaveTypewith the full schema; employee leave types now returnEmployeeLeaveTypeSettings:GET /Settingsunwraps from camelCasesettings;trackingCategories()moved to its own call;StatutoryDeductioncorrected to real schema
Payroll AU:- removed the phantom
PayrollCalendars::update()(onlyGET/POSTexist) PayRun::payslips()now returns embeddedPayslipSummary[]from the pay run response; addedPayRuns::payslip($id)for the fullPayslip; removed phantomPayslipscollectionEmployee::leaveBalances()andEmployees::leaveBalances($id)removed (the endpoint does not exist; leave balances are on theEmployeeresource itself)
- removed the phantom
Accounting:BankTransfers,Currencies,ExpenseClaims(create),LinkedTransactions,PaymentServices, andContactGroups/{id}/Contactsnow sendPUT(wasPOST, which Xero rejects for these resources)- Many Accounting, Payroll, and other models gained missing spec fields (
ValidationErrors,StatusAttributeString,UpdatedDateUTC, nested sub-models) across 46 models Accounting/Allocation: removed theAllocationIdalias; onlyAllocationIDis in the specPayroll AU/PayslipandPayslipSummary: removedLastEdited, which is not in the AU payroll spec
First public release.
- Fluent, framework-agnostic SDK for PHP 8.2 to 8.5, no runtime dependencies
- Typed models across all major Xero API families
- OAuth2 authorization URL, token exchange, token refresh, PKCE, custom connections, tenant discovery, disconnect, and webhook verification
Accounting: contacts, invoices, payments, accounts, items, tax rates, tracking categories, currencies, branding themes, organisations, users, credit notes, bank transactions, bank transfers, linked transactions, overpayments, prepayments, batch payments, manual journals, contact groups, expense claims, journals, purchase orders, quotes, receipts, repeating invoices, payment services, reports, attachments, history helpers, PDFs, and invoice remindersFiles: uploads, folders, inbox, associations, object-side lookup, counts, content reads, metadata updates, and deletesAssets: assets, asset types, settings, and collection search parametersProjects: projects, users, tasks, time entries, and lifecycle patch helpersPayroll AU: employees, leave balances, leave applications, pay items, pay runs, payslips, timesheets, payroll calendars, settings, super funds, and super fund productsPayroll NZ: employees, employment, leave, payment method, salary and wages, leave setup, opening balances, leave types, pay run calendars, pay runs, timesheets, settings, and statutory deductionsPayroll UK: employees, leave balances, leave types, leave records, employment, payment methods, pay run calendars, pay runs, payslips, timesheets, settings helpers, and reimbursementsFinance: bank statement accounting, cash validation, and financial statements (balance sheet, cashflow, profit and loss, trial balance, contact revenue, contact expenses)App Store: subscriptions and usage records- CI across PHP 8.2, 8.3, 8.4, and 8.5; PHPStan max; 100% test coverage
- Granular scopes are covered in code and docs
- Apps created on or after 2026-03-02 should use granular scopes
- All apps must migrate off broad scopes by September 2027
Accounting > Employeesis deprecated by Xero; use the Payroll API for employee management