Skip to main content
Xero is a cloud-based accounting platform for small and medium businesses, covering invoicing, bank reconciliation, expenses, payments, and financial reporting. This connector extracts your accounting data through the Xero Accounting API, landing organizations, contacts, invoices, payments, journals, and related entities in your Catalog.

Configuring Xero as a Source

In the Sources tab, click on the “Add source” button located on the top right of your screen. Then, select the Xero option from the list of connectors. Click Next and you’ll be prompted to add your access.

1. Add account access

Xero uses managed OAuth2, so you do not need to create an app or copy any credentials. Click the Authorization button and sign in with your Xero account, then choose the organisation you want Nekt to access. Nekt requests read-only scopes, so the connector can only read your data — it cannot modify anything in Xero. The following configurations are available:
  • Start date: The earliest date from which records will be synced. Records created or updated after this date will be extracted.
Optionally, under advanced settings you can define:
  • Tenant ID: The Xero tenant (organisation) ID to extract. Leave this empty to use the first organisation connected during authorization.
  • Include archived contacts: (Default: false) When enabled, archived contacts are included in the contacts stream.
Once you’re done, click Next.

2. Select streams

Choose which data streams you want to sync. For faster extractions, select only the streams that are relevant to your analysis. You can select entire groups of streams or pick specific ones.
Tip: The stream can be found more easily by typing its name.
Select the streams and click Next.

3. Configure data streams

Customize how you want your data to appear in your catalog. Select the desired layer where the data will be placed, a folder to organize it inside the layer, a name for each table (which will effectively contain the fetched data) and the type of sync.
  • Layer: choose between the existing layers on your catalog. This is where you will find your new extracted tables as the extraction runs successfully.
  • Folder: a folder can be created inside the selected layer to group all tables being created from this new data source.
  • Table name: we suggest a name, but feel free to customize it. You have the option to add a prefix to all tables at once and make this process faster!
  • Sync Type: you can choose between INCREMENTAL and FULL_TABLE.
    • Incremental: every time the extraction happens, we’ll get only the new data - which is good if, for example, you want to keep every record ever fetched.
    • Full table: every time the extraction happens, we’ll get the current state of the data - which is good if, for example, you don’t want to have deleted data in your catalog.
Once you are done configuring, click Next.

4. Configure data source

Describe your data source for easy identification within your organization, not exceeding 140 characters. To define your Trigger, consider how often you want data to be extracted from this source. This decision usually depends on how frequently you need the new table data updated (every day, once a week, or only at specific times). Optionally, you can define some additional settings:
  • Configure Delta Log Retention and determine for how long we should store old states of this table as it gets updated. Read more about this resource here.
  • Determine when to execute an Additional Full Sync. This will complement the incremental data extractions, ensuring that your data is completely synchronized with your source every once in a while.
Once you are ready, click Next to finalize the setup.

5. Check your new source

You can view your new source on the Sources page. If needed, manually trigger the source extraction by clicking on the arrow button. Once executed, your data will appear in your Catalog.
For you to be able to see it on your Catalog, you need at least one successful source run.

API Behaviors and Limitations

Incremental extraction

Most streams are extracted incrementally. The connector tracks the last value of each stream’s replication key and, on the next run, sends an If-Modified-Since header to Xero so only records changed after that point are fetched. The replication key is updated_date_utc for most streams, created_date_utc for bank_transfers, and journal_number for journals. The following streams do not support incremental filtering and are always synced as full table: branding_themes, contact_groups, currencies, organisations, repeating_invoices, tax_rates, and tracking_categories.

Access limitations

The connector gracefully handles access limitations to specific Xero products or data. For instance, the Journals stream requires a specific scope that is not universally granted, and the Payroll AU streams (employees, pay_runs, pay_run_payslips) require an Australian Xero organisation with Payroll enabled as well as the payroll.*.read scopes. When Xero denies access to these resources (HTTP 401, 403, or 404), the connector will skip the stream automatically with a warning rather than failing the entire data extraction run.
Many complex fields (such as line_items, contact, addresses, phones, allocations, payments, and journal_lines) are delivered as JSON-encoded strings rather than native nested objects. To work with their contents, parse the string downstream (for example with JSON_PARSE/JSON_EXTRACT on AWS or JSON_VALUE/JSON_QUERY on GCP).

Streams and Fields

Available streams

The table below lists every stream, its slug (the exact identifier to pass when creating the source via API) and a short description.

Fields by stream

Below you’ll find all available data streams from Xero and their corresponding fields.
The chart of accounts in the organisation.Primary key: account_id
Sync: Incremental on updated_date_utc
Spend and receive money transactions against bank accounts.Primary key: bank_transaction_id
Sync: Incremental on updated_date_utc
Transfers of money between two bank accounts.Primary key: bank_transfer_id
Sync: Incremental on created_date_utc
Branding themes used on invoices and other documents.Primary key: branding_theme_id
Sync: Full table
Groups used to organize contacts.Primary key: contact_group_id
Sync: Full table
Customers and suppliers in the organisation. Archived contacts are included only when “Include archived contacts” is enabled.Primary key: contact_id
Sync: Incremental on updated_date_utc
Credit notes issued to customers or received from suppliers.Primary key: credit_note_id
Sync: Incremental on updated_date_utc
Currencies set up in the organisation.Primary key: code
Sync: Full table
Payroll employees (Xero Payroll Australia).Primary key: employee_id
Sync: Incremental on updated_date_utc
Sales invoices (ACCREC) and bills (ACCPAY).Primary key: invoice_id
Sync: Incremental on updated_date_utc
Inventory and non-inventory items.Primary key: item_id
Sync: Incremental on updated_date_utc
Posted journals representing the underlying double-entry transactions.Primary key: journal_id
Sync: Incremental on journal_number. This endpoint does not support the If-Modified-Since header — it is paginated by an offset equal to the highest journal number already seen.
The journals stream requires the Xero accounting.journals scope, which the granular-scoped Nekt app does not request. When this scope is absent, Xero returns a 401 and the connector skips the stream automatically with a warning instead of failing the run. If you need journals, contact our support team.
Links between billable expenses and the invoices they are charged on (billable expenses / on-charging).Primary key: linked_transaction_id
Sync: Incremental on updated_date_utc. This endpoint does not support the If-Modified-Since header, so records are paged through in full and filtered client-side by updated_date_utc.
Manual journal entries posted directly to the ledger.Primary key: manual_journal_id
Sync: Incremental on updated_date_utc
The Xero organisation(s) connected to the credentials, including settings and metadata.Primary key: organisation_id
Sync: Full table
Overpayments recorded against contacts.Primary key: overpayment_id
Sync: Incremental on updated_date_utc
Payslip summaries of each pay run (Xero Payroll Australia).Primary key: payslip_id
Sync: Incremental on updated_date_utc
Pay runs of the organisation (Xero Payroll Australia).Primary key: pay_run_id
Sync: Incremental on updated_date_utc
Payments applied to invoices, credit notes, prepayments, and overpayments.Primary key: payment_id
Sync: Incremental on updated_date_utc
Prepayments recorded against contacts.Primary key: prepayment_id
Sync: Incremental on updated_date_utc
Purchase orders raised against suppliers.Primary key: purchase_order_id
Sync: Incremental on updated_date_utc
Quotes issued to customers.Primary key: quote_id
Sync: Incremental on updated_date_utc
Templates for recurring invoices.Primary key: repeating_invoice_id
Sync: Full table
Tax rates configured in the organisation.Primary key: tax_type
Sync: Full table
Tracking categories and their options for reporting.Primary key: tracking_category_id
Sync: Full table
Users with access to the organisation.Primary key: user_id
Sync: Incremental on updated_date_utc

Skills for agents

Download Xero skills file

Xero connector documentation as plain markdown, for use in AI agent contexts.