> ## Documentation Index
> Fetch the complete documentation index at: https://docs.nekt.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Xero as a data source

> Bring data from Xero to Nekt.

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](https://developer.xero.com/documentation/api/accounting/overview), landing organizations, contacts, invoices, payments, journals, and related entities in your Catalog.

<img height="50" src="https://mintcdn.com/nekt/bo-gjd__6_5DQxA9/assets/logo/logo-xero.png?fit=max&auto=format&n=bo-gjd__6_5DQxA9&q=85&s=950f5d7f636f8dfdad87c94fd4aebd47" data-path="assets/logo/logo-xero.png" />

## Configuring Xero as a Source

In the [Sources](https://app.nekt.ai/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](https://docs.nekt.com/runs/scheduling-and-triggers), 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](https://docs.nekt.com/get-started/core-concepts/resource-control).
* Determine when to execute an **Additional [Full Sync](https://docs.nekt.com/get-started/core-concepts/types-of-sync#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](https://app.nekt.ai/sources) page. If needed, manually trigger the source extraction by clicking on the arrow button. Once executed, your data will appear in your Catalog.

<Warning>For you to be able to see it on your [Catalog](https://app.nekt.ai/catalog), you need at least one successful source run.</Warning>

## 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`.

<Note>
  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). These fields are noted as "JSON string" in the stream descriptions below.
</Note>

# Streams and Fields

Below you'll find all available data streams from Xero and their corresponding fields. Each accordion lists the stream's primary key, its sync behavior, and all fields.

<AccordionGroup>
  <Accordion title="accounts">
    The chart of accounts in the organisation. **Primary key:** `account_id`. **Sync:** Incremental on `updated_date_utc`.

    * `account_id` - Unique identifier for the account
    * `code` - Account code
    * `name` - Account name
    * `type` - Account type
    * `class` - Account class
    * `status` - Account status
    * `description` - Description of the account
    * `system_account` - System account indicator
    * `bank_account_type` - Type of bank account
    * `bank_account_number` - Bank account number
    * `currency_code` - Currency code of the account
    * `tax_type` - Default tax type
    * `reporting_code` - Reporting code
    * `reporting_code_name` - Reporting code name
    * `show_in_expense_claims` - Whether the account appears in expense claims
    * `enable_payments_to_account` - Whether payments can be made to this account
    * `has_attachments` - Whether the account has attachments
    * `add_to_watchlist` - Whether the account is on the watchlist
    * `updated_date_utc` - Last modified timestamp (replication key)
  </Accordion>

  <Accordion title="bank_transactions">
    Spend and receive money transactions against bank accounts. **Primary key:** `bank_transaction_id`. **Sync:** Incremental on `updated_date_utc`.

    * `bank_transaction_id` - Unique identifier for the bank transaction
    * `type` - Transaction type (e.g. SPEND, RECEIVE)
    * `status` - Transaction status
    * `contact` - Associated contact (JSON string)
    * `line_items` - Transaction line items (JSON string)
    * `bank_account` - Bank account the transaction belongs to (JSON string)
    * `is_reconciled` - Whether the transaction is reconciled
    * `date` - Transaction date
    * `date_string` - Transaction date as string
    * `reference` - Reference
    * `currency_code` - Currency code
    * `currency_rate` - Currency exchange rate
    * `url` - Source URL
    * `line_amount_types` - Whether line amounts are tax inclusive, exclusive, or no tax
    * `sub_total` - Sub-total
    * `total_tax` - Total tax
    * `total` - Total amount
    * `prepayment_id` - Related prepayment ID
    * `overpayment_id` - Related overpayment ID
    * `has_attachments` - Whether the transaction has attachments
    * `external_link_provider_name` - External link provider name
    * `updated_date_utc` - Last modified timestamp (replication key)
  </Accordion>

  <Accordion title="bank_transfers">
    Transfers of money between two bank accounts. **Primary key:** `bank_transfer_id`. **Sync:** Incremental on `created_date_utc`.

    * `bank_transfer_id` - Unique identifier for the bank transfer
    * `from_bank_account` - Source bank account (JSON string)
    * `to_bank_account` - Destination bank account (JSON string)
    * `amount` - Transfer amount
    * `date` - Transfer date
    * `date_string` - Transfer date as string
    * `currency_rate` - Currency exchange rate
    * `from_bank_transaction_id` - Source bank transaction ID
    * `to_bank_transaction_id` - Destination bank transaction ID
    * `has_attachments` - Whether the transfer has attachments
    * `created_date_utc` - Creation timestamp (replication key)
    * `created_date_utc_string` - Creation timestamp as string
  </Accordion>

  <Accordion title="branding_themes">
    Branding themes used on invoices and other documents. **Primary key:** `branding_theme_id`. **Sync:** Full table.

    * `branding_theme_id` - Unique identifier for the branding theme
    * `name` - Branding theme name
    * `type` - Branding theme type
    * `logo_url` - Logo URL
    * `sort_order` - Sort order
    * `created_date_utc` - Creation timestamp
  </Accordion>

  <Accordion title="contact_groups">
    Groups used to organize contacts. **Primary key:** `contact_group_id`. **Sync:** Full table.

    * `contact_group_id` - Unique identifier for the contact group
    * `name` - Contact group name
    * `status` - Contact group status
    * `has_validation_errors` - Whether the group has validation errors
    * `contacts` - Contacts in the group (JSON string)
  </Accordion>

  <Accordion title="contacts">
    Customers and suppliers in the organisation. **Primary key:** `contact_id`. **Sync:** Incremental on `updated_date_utc`. Archived contacts are included only when "Include archived contacts" is enabled.

    * `contact_id` - Unique identifier for the contact
    * `contact_number` - Contact number
    * `account_number` - Account number
    * `contact_status` - Contact status
    * `name` - Contact name
    * `first_name` - First name
    * `last_name` - Last name
    * `email_address` - Email address
    * `skype_user_name` - Skype username
    * `bank_account_details` - Bank account details
    * `tax_number` - Tax number
    * `accounts_receivable_tax_type` - Accounts receivable tax type
    * `accounts_payable_tax_type` - Accounts payable tax type
    * `addresses` - Contact addresses (JSON string)
    * `phones` - Contact phone numbers (JSON string)
    * `is_supplier` - Whether the contact is a supplier
    * `is_customer` - Whether the contact is a customer
    * `default_currency` - Default currency
    * `contact_persons` - Additional contact persons (JSON string)
    * `xero_network_key` - Xero network key
    * `sales_default_account_code` - Default sales account code
    * `purchases_default_account_code` - Default purchases account code
    * `sales_tracking_categories` - Sales tracking categories (JSON string)
    * `purchases_tracking_categories` - Purchases tracking categories (JSON string)
    * `tracking_category_name` - Tracking category name
    * `tracking_category_option` - Tracking category option
    * `payment_terms` - Payment terms (JSON string)
    * `contact_groups` - Groups the contact belongs to (JSON string)
    * `website` - Website
    * `branding_theme` - Default branding theme (JSON string)
    * `batch_payments` - Batch payment details (JSON string)
    * `discount` - Default discount
    * `balances` - Outstanding and overdue balances (JSON string)
    * `has_attachments` - Whether the contact has attachments
    * `attachments` - Attachments (JSON string)
    * `has_validation_errors` - Whether the contact has validation errors
    * `validation_errors` - Validation errors (JSON string)
    * `updated_date_utc` - Last modified timestamp (replication key)
  </Accordion>

  <Accordion title="credit_notes">
    Credit notes issued to customers or received from suppliers. **Primary key:** `credit_note_id`. **Sync:** Incremental on `updated_date_utc`.

    * `credit_note_id` - Unique identifier for the credit note
    * `id` - Identifier alias
    * `credit_note_number` - Credit note number
    * `type` - Credit note type
    * `status` - Credit note status
    * `contact` - Associated contact (JSON string)
    * `date` - Credit note date
    * `date_string` - Credit note date as string
    * `due_date` - Due date
    * `due_date_string` - Due date as string
    * `line_amount_types` - Whether line amounts are tax inclusive, exclusive, or no tax
    * `line_items` - Line items (JSON string)
    * `invoice_addresses` - Invoice addresses (JSON string)
    * `sub_total` - Sub-total
    * `applied_amount` - Applied amount
    * `total_tax` - Total tax
    * `total` - Total amount
    * `currency_code` - Currency code
    * `currency_rate` - Currency exchange rate
    * `remaining_credit` - Remaining credit
    * `allocations` - Allocations against invoices (JSON string)
    * `branding_theme_id` - Branding theme ID
    * `reference` - Reference
    * `sent_to_contact` - Whether sent to the contact
    * `fully_paid_on_date` - Date fully paid
    * `has_attachments` - Whether the credit note has attachments
    * `updated_date_utc` - Last modified timestamp (replication key)
  </Accordion>

  <Accordion title="currencies">
    Currencies set up in the organisation. **Primary key:** `code`. **Sync:** Full table.

    * `code` - Currency code
    * `description` - Currency description
  </Accordion>

  <Accordion title="invoices">
    Sales invoices (ACCREC) and bills (ACCPAY). **Primary key:** `invoice_id`. **Sync:** Incremental on `updated_date_utc`.

    * `invoice_id` - Unique identifier for the invoice
    * `invoice_number` - Invoice number
    * `type` - Invoice type (ACCREC or ACCPAY)
    * `status` - Invoice status
    * `contact` - Associated contact (JSON string)
    * `date` - Invoice date
    * `date_string` - Invoice date as string
    * `due_date` - Due date
    * `due_date_string` - Due date as string
    * `line_amount_types` - Whether line amounts are tax inclusive, exclusive, or no tax
    * `line_items` - Line items (JSON string)
    * `sub_total` - Sub-total
    * `total_tax` - Total tax
    * `total` - Total amount
    * `total_discount` - Total discount
    * `currency_code` - Currency code
    * `currency_rate` - Currency exchange rate
    * `reference` - Reference
    * `branding_theme_id` - Branding theme ID
    * `url` - Source URL
    * `sent_to_contact` - Whether sent to the contact
    * `expected_payment_date` - Expected payment date
    * `expected_payment_date_string` - Expected payment date as string
    * `planned_payment_date` - Planned payment date
    * `planned_payment_date_string` - Planned payment date as string
    * `has_attachments` - Whether the invoice has attachments
    * `payments` - Payments applied (JSON string)
    * `credit_notes` - Credit notes applied (JSON string)
    * `prepayments` - Prepayments applied (JSON string)
    * `overpayments` - Overpayments applied (JSON string)
    * `amount_due` - Amount due
    * `amount_paid` - Amount paid
    * `amount_credited` - Amount credited
    * `fully_paid_on_date` - Date fully paid
    * `is_discounted` - Whether the invoice is discounted
    * `has_errors` - Whether the invoice has errors
    * `invoice_addresses` - Invoice addresses (JSON string)
    * `invoice_payment_services` - Payment services (JSON string)
    * `repeating_invoice_id` - Source repeating invoice ID
    * `updated_date_utc` - Last modified timestamp (replication key)
  </Accordion>

  <Accordion title="items">
    Inventory and non-inventory items. **Primary key:** `item_id`. **Sync:** Incremental on `updated_date_utc`.

    * `item_id` - Unique identifier for the item
    * `code` - Item code
    * `name` - Item name
    * `description` - Sales description
    * `purchase_description` - Purchase description
    * `is_sold` - Whether the item is sold
    * `is_purchased` - Whether the item is purchased
    * `purchase_details` - Purchase details (JSON string)
    * `sales_details` - Sales details (JSON string)
    * `is_tracked_as_inventory` - Whether tracked as inventory
    * `inventory_asset_account_code` - Inventory asset account code
    * `total_cost_pool` - Total cost pool
    * `quantity_on_hand` - Quantity on hand
    * `updated_date_utc` - Last modified timestamp (replication key)
  </Accordion>

  <Accordion title="journals">
    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.

    <Warning>
      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.
    </Warning>

    * `journal_id` - Unique identifier for the journal
    * `journal_number` - Sequential journal number (replication key)
    * `journal_date` - Journal date
    * `created_date_utc` - Creation timestamp
    * `reference` - Reference
    * `source_id` - Source document ID
    * `source_type` - Source document type
    * `journal_lines` - Journal lines (JSON string)
  </Accordion>

  <Accordion title="linked_transactions">
    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`.

    * `linked_transaction_id` - Unique identifier for the linked transaction
    * `status` - Linked transaction status
    * `type` - Linked transaction type
    * `source_transaction_id` - Source transaction ID
    * `source_line_item_id` - Source line item ID
    * `source_transaction_type_code` - Source transaction type code
    * `contact_id` - Associated contact ID
    * `target_transaction_id` - Target transaction ID
    * `target_line_item_id` - Target line item ID
    * `updated_date_utc` - Last modified timestamp (replication key)
  </Accordion>

  <Accordion title="manual_journals">
    Manual journal entries posted directly to the ledger. **Primary key:** `manual_journal_id`. **Sync:** Incremental on `updated_date_utc`.

    * `manual_journal_id` - Unique identifier for the manual journal
    * `date` - Journal date
    * `status` - Manual journal status
    * `narration` - Narration / description
    * `line_amount_types` - Whether line amounts are tax inclusive, exclusive, or no tax
    * `journal_lines` - Journal lines (JSON string)
    * `url` - Source URL
    * `show_on_cash_basis_reports` - Whether shown on cash basis reports
    * `has_attachments` - Whether the manual journal has attachments
    * `updated_date_utc` - Last modified timestamp (replication key)
  </Accordion>

  <Accordion title="organisations">
    The Xero organisation(s) connected to the credentials, including settings and metadata. **Primary key:** `organisation_id`. **Sync:** Full table.

    * `organisation_id` - Unique identifier for the organisation
    * `api_key` - API key
    * `name` - Organisation name
    * `legal_name` - Legal name
    * `short_code` - Short code
    * `pays_tax` - Whether the organisation pays tax
    * `version` - Xero version
    * `edition` - Xero edition
    * `class` - Organisation class
    * `organisation_type` - Organisation type
    * `organisation_entity_type` - Organisation entity type
    * `organisation_status` - Organisation status
    * `base_currency` - Base currency
    * `country_code` - Country code
    * `is_demo_company` - Whether it is a demo company
    * `registration_number` - Registration number
    * `tax_number` - Tax number
    * `tax_number_name` - Tax number label
    * `financial_year_end_day` - Financial year end day
    * `financial_year_end_month` - Financial year end month
    * `sales_tax_basis` - Sales tax basis
    * `sales_tax_period` - Sales tax period
    * `default_sales_tax` - Default sales tax
    * `default_purchases_tax` - Default purchases tax
    * `period_lock_date` - Period lock date
    * `end_of_year_lock_date` - End of year lock date
    * `timezone` - Timezone
    * `line_of_business` - Line of business
    * `addresses` - Organisation addresses (JSON string)
    * `phones` - Organisation phone numbers (JSON string)
    * `external_links` - External links (JSON string)
    * `payment_terms` - Payment terms (JSON string)
    * `created_date_utc` - Creation timestamp
  </Accordion>

  <Accordion title="overpayments">
    Overpayments recorded against contacts. **Primary key:** `overpayment_id`. **Sync:** Incremental on `updated_date_utc`.

    * `overpayment_id` - Unique identifier for the overpayment
    * `id` - Identifier alias
    * `type` - Overpayment type
    * `status` - Overpayment status
    * `contact` - Associated contact (JSON string)
    * `date` - Overpayment date
    * `date_string` - Overpayment date as string
    * `line_amount_types` - Whether line amounts are tax inclusive, exclusive, or no tax
    * `line_items` - Line items (JSON string)
    * `applied_amount` - Applied amount
    * `sub_total` - Sub-total
    * `total_tax` - Total tax
    * `total` - Total amount
    * `currency_code` - Currency code
    * `currency_rate` - Currency exchange rate
    * `remaining_credit` - Remaining credit
    * `allocations` - Allocations against invoices (JSON string)
    * `payments` - Payments (JSON string)
    * `reference` - Reference
    * `has_attachments` - Whether the overpayment has attachments
    * `updated_date_utc` - Last modified timestamp (replication key)
  </Accordion>

  <Accordion title="payments">
    Payments applied to invoices, credit notes, prepayments, and overpayments. **Primary key:** `payment_id`. **Sync:** Incremental on `updated_date_utc`.

    * `payment_id` - Unique identifier for the payment
    * `date` - Payment date
    * `amount` - Payment amount
    * `bank_amount` - Bank amount
    * `currency_rate` - Currency exchange rate
    * `reference` - Reference
    * `is_reconciled` - Whether the payment is reconciled
    * `status` - Payment status
    * `payment_type` - Payment type
    * `account` - Account paid from/to (JSON string)
    * `has_account` - Whether an account is set
    * `invoice` - Related invoice (JSON string)
    * `credit_note` - Related credit note (JSON string)
    * `prepayments` - Related prepayments (JSON string)
    * `overpayment` - Related overpayment (JSON string)
    * `batch_payment_id` - Batch payment ID
    * `batch_payment` - Batch payment details (JSON string)
    * `has_validation_errors` - Whether the payment has validation errors
    * `updated_date_utc` - Last modified timestamp (replication key)
  </Accordion>

  <Accordion title="prepayments">
    Prepayments recorded against contacts. **Primary key:** `prepayment_id`. **Sync:** Incremental on `updated_date_utc`.

    * `prepayment_id` - Unique identifier for the prepayment
    * `id` - Identifier alias
    * `type` - Prepayment type
    * `status` - Prepayment status
    * `contact` - Associated contact (JSON string)
    * `date` - Prepayment date
    * `date_string` - Prepayment date as string
    * `line_amount_types` - Whether line amounts are tax inclusive, exclusive, or no tax
    * `line_items` - Line items (JSON string)
    * `sub_total` - Sub-total
    * `total_tax` - Total tax
    * `total` - Total amount
    * `currency_code` - Currency code
    * `currency_rate` - Currency exchange rate
    * `reference` - Reference
    * `remaining_credit` - Remaining credit
    * `applied_amount` - Applied amount
    * `allocations` - Allocations against invoices (JSON string)
    * `payments` - Payments (JSON string)
    * `has_attachments` - Whether the prepayment has attachments
    * `updated_date_utc` - Last modified timestamp (replication key)
  </Accordion>

  <Accordion title="purchase_orders">
    Purchase orders raised against suppliers. **Primary key:** `purchase_order_id`. **Sync:** Incremental on `updated_date_utc`.

    * `purchase_order_id` - Unique identifier for the purchase order
    * `purchase_order_number` - Purchase order number
    * `type` - Purchase order type
    * `status` - Purchase order status
    * `contact` - Associated contact (JSON string)
    * `date` - Order date
    * `date_string` - Order date as string
    * `delivery_date` - Delivery date
    * `delivery_date_string` - Delivery date as string
    * `expected_arrival_date` - Expected arrival date
    * `expected_arrival_date_string` - Expected arrival date as string
    * `line_amount_types` - Whether line amounts are tax inclusive, exclusive, or no tax
    * `line_items` - Line items (JSON string)
    * `reference` - Reference
    * `branding_theme_id` - Branding theme ID
    * `currency_code` - Currency code
    * `currency_rate` - Currency exchange rate
    * `sent_to_contact` - Whether sent to the contact
    * `delivery_address` - Delivery address
    * `attention_to` - Attention to
    * `telephone` - Telephone
    * `delivery_instructions` - Delivery instructions
    * `sub_total` - Sub-total
    * `total_tax` - Total tax
    * `total` - Total amount
    * `total_discount` - Total discount
    * `is_discounted` - Whether the order is discounted
    * `has_errors` - Whether the order has errors
    * `has_attachments` - Whether the order has attachments
    * `updated_date_utc` - Last modified timestamp (replication key)
  </Accordion>

  <Accordion title="quotes">
    Quotes issued to customers. **Primary key:** `quote_id`. **Sync:** Incremental on `updated_date_utc`.

    * `quote_id` - Unique identifier for the quote
    * `quote_number` - Quote number
    * `status` - Quote status
    * `contact` - Associated contact (JSON string)
    * `date` - Quote date
    * `expiry_date` - Expiry date
    * `line_amount_types` - Whether line amounts are tax inclusive, exclusive, or no tax
    * `line_items` - Line items (JSON string)
    * `sub_total` - Sub-total
    * `total_tax` - Total tax
    * `total` - Total amount
    * `total_discount` - Total discount
    * `currency_code` - Currency code
    * `currency_rate` - Currency exchange rate
    * `reference` - Reference
    * `branding_theme_id` - Branding theme ID
    * `title` - Quote title
    * `summary` - Quote summary
    * `terms` - Quote terms
    * `tracking_category` - Tracking category (JSON string)
    * `updated_date_utc` - Last modified timestamp (replication key)
  </Accordion>

  <Accordion title="repeating_invoices">
    Templates for recurring invoices. **Primary key:** `repeating_invoice_id`. **Sync:** Full table.

    * `repeating_invoice_id` - Unique identifier for the repeating invoice
    * `id` - Identifier alias
    * `type` - Invoice type
    * `status` - Repeating invoice status
    * `contact` - Associated contact (JSON string)
    * `schedule` - Recurrence schedule (JSON string)
    * `line_items` - Line items (JSON string)
    * `line_amount_types` - Whether line amounts are tax inclusive, exclusive, or no tax
    * `reference` - Reference
    * `branding_theme_id` - Branding theme ID
    * `currency_code` - Currency code
    * `sub_total` - Sub-total
    * `total_tax` - Total tax
    * `total` - Total amount
    * `total_discount` - Total discount
    * `has_attachments` - Whether the repeating invoice has attachments
  </Accordion>

  <Accordion title="tax_rates">
    Tax rates configured in the organisation. **Primary key:** `tax_type`. **Sync:** Full table.

    * `tax_type` - Tax type (primary key)
    * `name` - Tax rate name
    * `status` - Tax rate status
    * `report_tax_type` - Report tax type
    * `tax_components` - Tax components (JSON string)
    * `display_tax_rate` - Display tax rate
    * `effective_rate` - Effective tax rate
    * `can_apply_to_assets` - Whether it can apply to assets
    * `can_apply_to_equity` - Whether it can apply to equity
    * `can_apply_to_expenses` - Whether it can apply to expenses
    * `can_apply_to_liabilities` - Whether it can apply to liabilities
    * `can_apply_to_revenue` - Whether it can apply to revenue
  </Accordion>

  <Accordion title="tracking_categories">
    Tracking categories and their options for reporting. **Primary key:** `tracking_category_id`. **Sync:** Full table.

    * `tracking_category_id` - Unique identifier for the tracking category
    * `name` - Tracking category name
    * `status` - Tracking category status
    * `tracking_category_name` - Tracking category name (alternate)
    * `option` - Tracking option
    * `options` - Available options (JSON string)
    * `tracking_option_id` - Tracking option ID
    * `tracking_option_name` - Tracking option name
  </Accordion>

  <Accordion title="users">
    Users with access to the organisation. **Primary key:** `user_id`. **Sync:** Incremental on `updated_date_utc`.

    * `user_id` - Unique identifier for the user
    * `email_address` - Email address
    * `first_name` - First name
    * `last_name` - Last name
    * `organisation_role` - Role within the organisation
    * `is_subscriber` - Whether the user is a subscriber
    * `global_user_id` - Global user ID
    * `validation_errors` - Validation errors (JSON string)
    * `updated_date_utc` - Last modified timestamp (replication key)
  </Accordion>
</AccordionGroup>

## Skills for agents

<Snippet file="agent-skills-intro.mdx" />

<Card title="Download Xero skills file" icon="wand-magic-sparkles" href="/sources/xero.md">
  Xero connector documentation as plain markdown, for use in AI agent contexts.
</Card>
