Xero Assets API – Fixed asset lifecycle management.
Base URL: https://api.xero.com/assets.xro/1.0/
Scopes: assets or assets.read
Status Flow
DRAFT → REGISTERED → DISPOSED
DRAFT → DISPOSED (direct)Depreciation Methods
StraightLine— equal annual chargeDiminishingValue100/DiminishingValue150/DiminishingValue200FullDepreciation— 100% in year of purchaseNoDepreciation
Averaging Methods
ActualDays— based on the number of days in the periodFullMonth— depreciation for the full month
Examples
{:ok, %{"items" => assets}} = Xero.Assets.list(token, tenant_id, status: "REGISTERED")
{:ok, asset} = Xero.Assets.create(token, tenant_id, %{
"assetName" => "Office Laptop",
"assetNumber" => "LAPTOP-001",
"purchaseDate" => "2024-01-15",
"purchasePrice" => 1200.00,
"assetStatus" => "DRAFT",
"bookDepreciationSetting" => %{
"depreciationMethod" => "StraightLine",
"averagingMethod" => "ActualDays",
"depreciationRate" => 0.25,
"depreciationCalculationMethod" => "None"
}
})
# Move from DRAFT → REGISTERED
{:ok, _} = Xero.Assets.update(token, tenant_id, asset_id, %{"assetStatus" => "REGISTERED"})
# Dispose of a registered asset
{:ok, _} = Xero.Assets.dispose(token, tenant_id, asset_id, %{
"disposalDate" => "2024-06-30",
"disposalPrice" => 200.00,
"disposalType" => "SOLD"
})
Summary
Functions
Returns all asset types defined in the organisation.
Creates a new fixed asset. Assets start in DRAFT status.
Creates a new asset type.
Deletes a DRAFT asset. Only DRAFT assets can be deleted. REGISTERED assets must be disposed of instead.
Returns depreciation schedules for all registered assets.
Disposes of a REGISTERED asset.
Retrieves a single asset by ID.
Lists fixed assets.
Runs depreciation for all assets up to a specific date.
Returns asset settings (default depreciation accounts) for the organisation.
Updates a DRAFT asset. Only DRAFT assets can be updated.
To register an asset, update with assetStatus: "REGISTERED".
Updates an existing asset type.
Functions
@spec asset_types(Xero.Auth.Token.t(), String.t()) :: {:ok, map()} | {:error, Xero.Error.t()}
Returns all asset types defined in the organisation.
@spec create(Xero.Auth.Token.t(), String.t(), map()) :: {:ok, map()} | {:error, Xero.Error.t()}
Creates a new fixed asset. Assets start in DRAFT status.
Required fields
"assetName"— Display name"assetStatus"—"DRAFT"or"REGISTERED""bookDepreciationSetting"— Depreciation config map
@spec create_asset_type(Xero.Auth.Token.t(), String.t(), map()) :: {:ok, map()} | {:error, Xero.Error.t()}
Creates a new asset type.
Required fields
"assetTypeName"— Display name for the type"fixedAssetAccountId"— GL account for the asset value"depreciationExpenseAccountId"— GL account for depreciation expense"accumulatedDepreciationAccountId"— GL account for accumulated depreciation"bookDepreciationSetting"— Default depreciation settings for this type
@spec delete(Xero.Auth.Token.t(), String.t(), String.t()) :: :ok | {:error, Xero.Error.t()}
Deletes a DRAFT asset. Only DRAFT assets can be deleted. REGISTERED assets must be disposed of instead.
@spec depreciation_schedules(Xero.Auth.Token.t(), String.t(), keyword()) :: {:ok, map()} | {:error, Xero.Error.t()}
Returns depreciation schedules for all registered assets.
Options
:book_effective_date_of_depreciation— Date to calculate from (YYYY-MM-DD)
@spec dispose(Xero.Auth.Token.t(), String.t(), String.t(), map()) :: {:ok, map()} | {:error, Xero.Error.t()}
Disposes of a REGISTERED asset.
Required disposal fields
"disposalDate"— Date of disposal (YYYY-MM-DD)"disposalType"—"SOLD","SCRAPPED", or"WRITTEN_OFF"
Optional fields
"disposalPrice"— Proceeds from sale (default 0)"disposalAccount"— Account code for disposal proceeds
@spec get(Xero.Auth.Token.t(), String.t(), String.t()) :: {:ok, map()} | {:error, Xero.Error.t()}
Retrieves a single asset by ID.
@spec list(Xero.Auth.Token.t(), String.t(), keyword()) :: {:ok, map()} | {:error, Xero.Error.t()}
Lists fixed assets.
Options
:status—"DRAFT","REGISTERED", or"DISPOSED":page— Page number (default 1):page_size— Items per page (max 100, default 10):order_by— Field to order by:"AssetName","AssetNumber","AssetStatus","DepreciableAmount","TotalDepreciationAmount","BookValue":sort_direction—"ASC"or"DESC":filter_by— Free-text search across name, number, serial number
@spec run_depreciation(Xero.Auth.Token.t(), String.t(), map()) :: {:ok, map()} | {:error, Xero.Error.t()}
Runs depreciation for all assets up to a specific date.
Required fields
"depreciationDate"— Run depreciation up to this date (YYYY-MM-DD)
@spec settings(Xero.Auth.Token.t(), String.t()) :: {:ok, map()} | {:error, Xero.Error.t()}
Returns asset settings (default depreciation accounts) for the organisation.
@spec update(Xero.Auth.Token.t(), String.t(), String.t(), map()) :: {:ok, map()} | {:error, Xero.Error.t()}
Updates a DRAFT asset. Only DRAFT assets can be updated.
To register an asset, update with assetStatus: "REGISTERED".
@spec update_asset_type(Xero.Auth.Token.t(), String.t(), String.t(), map()) :: {:ok, map()} | {:error, Xero.Error.t()}
Updates an existing asset type.