# Fixed Assets

> Track fixed assets, depreciation schedules, and disposal.

- **Category:** Guides
- HTML version: https://www.ondayzero.com/docs/guides/fixed-assets
- All guides: https://www.ondayzero.com/docs/guides/index.md
- Endpoint catalog: https://www.ondayzero.com/docs/reference/index.md

---

# Fixed Assets

Fixed assets represent long-term tangible property (equipment, vehicles, furniture, etc.) that depreciates over time. This feature requires the **Fixed Assets** add-on.

## Asset Lifecycle

| Status | Description |
|--------|-------------|
| `draft` | Recorded but not yet in service — no depreciation |
| `active` | In service and depreciating |
| `fully_depreciated` | Book value has reached salvage value |
| `disposed` | Sold, traded, scrapped, lost or donated |

## Asset Categories

Organize assets by category with default depreciation settings and the ledgers each posting should hit:

```bash
curl -X POST "https://api.ondayzero.com/api/v1/fixed-assets/categories" \
  -H "Authorization: Bearer dz_your_token_here" \
  -H "x-business-id: YOUR_BUSINESS_ID" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Computer Equipment",
    "default_useful_life_months": 36,
    "default_depreciation_method": "straight_line",
    "default_salvage_percent": 10,
    "asset_ledger_id": "ASSET_LEDGER_UUID",
    "accumulated_depreciation_ledger_id": "ACCUM_DEPR_LEDGER_UUID",
    "depreciation_expense_ledger_id": "DEPR_EXPENSE_LEDGER_UUID"
  }'
```

Depreciation methods: `straight_line`, `declining_balance`, `double_declining`, `units_of_production`.

Seed standard categories (furniture, vehicles, equipment, etc.):

```bash
curl -X POST "https://api.ondayzero.com/api/v1/fixed-assets/categories/seed-defaults" \
  -H "Authorization: Bearer dz_your_token_here" \
  -H "x-business-id: YOUR_BUSINESS_ID"
```

`GET /api/v1/fixed-assets/categories` lists them; `PATCH` / `DELETE /api/v1/fixed-assets/categories/{category_id}` edit or remove one.

## Create a Fixed Asset

```bash
curl -X POST "https://api.ondayzero.com/api/v1/fixed-assets" \
  -H "Authorization: Bearer dz_your_token_here" \
  -H "x-business-id: YOUR_BUSINESS_ID" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "MacBook Pro M4",
    "category_id": "CATEGORY_UUID",
    "original_cost": 349900,
    "purchase_date": "2026-03-01",
    "useful_life_months": 36,
    "salvage_value": 30000,
    "depreciation_method": "straight_line",
    "serial_number": "C02XYZ123",
    "vendor_id": "VENDOR_UUID"
  }'
```

> `original_cost` and `salvage_value` are in cents. `349900` = $3,499.00.

Required: `name`, `original_cost`, `purchase_date`. `useful_life_months` defaults to `60`, `salvage_value` to `0`, `depreciation_method` to `straight_line`. Pass `in_service_date` to place the asset in service immediately; otherwise it is created as a `draft`. For `units_of_production`, also set `total_expected_units`.

### Capitalize from bank transactions

If the purchase already sits in a bank feed, turn those transactions into an asset instead of re-typing the cost:

```bash
curl -X POST "https://api.ondayzero.com/api/v1/fixed-assets/from-transactions" \
  -H "Authorization: Bearer dz_your_token_here" \
  -H "x-business-id: YOUR_BUSINESS_ID" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Delivery van",
    "ledger_id": "VEHICLES_LEDGER_UUID",
    "transaction_ids": ["TRANSACTION_UUID"],
    "useful_life_months": 84,
    "auto_place_in_service": true
  }'
```

The cost basis is the sum of the transactions' absolute amounts; all of them must already be categorized to `ledger_id`. `POST /api/v1/fixed-assets/suggest-capitalization` asks the AI which recent transactions look like capital purchases.

## List Fixed Assets

```bash
curl "https://api.ondayzero.com/api/v1/fixed-assets?status=active" \
  -H "Authorization: Bearer dz_your_token_here" \
  -H "x-business-id: YOUR_BUSINESS_ID"
```

| Parameter | Type | Description |
|-----------|------|-------------|
| `status` | string | `draft`, `active`, `fully_depreciated`, `disposed` |
| `category_id` | UUID | Filter by asset category |
| `search` | string | Match on name, asset number or serial number |
| `cursor` / `limit` | | Standard [pagination](/docs/guides/pagination) |

Each asset in the response includes computed `book_value`, `accumulated_depreciation`, `depreciable_amount`, `monthly_depreciation_amount` and `remaining_life_months`.

## Place in Service

Start depreciation on a `draft` asset:

```bash
curl -X POST "https://api.ondayzero.com/api/v1/fixed-assets/{asset_id}/place-in-service" \
  -H "Authorization: Bearer dz_your_token_here" \
  -H "x-business-id: YOUR_BUSINESS_ID" \
  -H "Content-Type: application/json" \
  -d '{"in_service_date": "2026-03-15"}'
```

## Depreciation

### View Schedule

```bash
curl "https://api.ondayzero.com/api/v1/fixed-assets/{asset_id}/depreciation-schedule" \
  -H "Authorization: Bearer dz_your_token_here" \
  -H "x-business-id: YOUR_BUSINESS_ID"
```

`GET /api/v1/fixed-assets/{asset_id}/depreciation-entries` returns the entries actually recorded so far, and `GET /api/v1/fixed-assets/depreciation-matrix?start_date=…&end_date=…` gives a month-by-asset grid across the whole register.

### Preview Period Depreciation

See what depreciation entries would be generated for a specific period:

```bash
curl "https://api.ondayzero.com/api/v1/fixed-assets/depreciation-preview?period_date=2026-03-31" \
  -H "Authorization: Bearer dz_your_token_here" \
  -H "x-business-id: YOUR_BUSINESS_ID"
```

### Run Depreciation

Post depreciation for a period — all active assets, or only `asset_ids`:

```bash
curl -X POST "https://api.ondayzero.com/api/v1/fixed-assets/run-depreciation" \
  -H "Authorization: Bearer dz_your_token_here" \
  -H "x-business-id: YOUR_BUSINESS_ID" \
  -H "Content-Type: application/json" \
  -d '{"period_date": "2026-03-31", "create_journal_entries": true}'
```

### Scheduled depreciation

DayZero can also queue every future depreciation entry up front and post each one when its date arrives:

- `POST /api/v1/fixed-assets/generate-schedules` queues draft entries for active assets that have none (a backfill; creates no journal entries).
- `GET /api/v1/fixed-assets/scheduled-journal-entries?through_date=…` shows what is queued.
- `POST /api/v1/fixed-assets/post-scheduled-depreciation` with an optional `{"as_of": "2026-03-31"}` posts everything due. It is idempotent — a retry cannot double-post.

## Dispose an Asset

Record the disposal (sale, write-off, etc.) of an asset:

```bash
curl -X POST "https://api.ondayzero.com/api/v1/fixed-assets/{asset_id}/dispose" \
  -H "Authorization: Bearer dz_your_token_here" \
  -H "x-business-id: YOUR_BUSINESS_ID" \
  -H "Content-Type: application/json" \
  -d '{
    "disposal_date": "2026-06-15",
    "disposal_method": "sold",
    "disposal_amount": 100000,
    "disposal_notes": "Sold to employee"
  }'
```

`disposal_method` is one of `sold`, `traded`, `scrapped`, `lost`, `donated`; `disposal_amount` (proceeds, in cents) defaults to `0`. Disposal automatically calculates the gain or loss against book value and creates the corresponding journal entries. Disposal is irreversible — confirm the asset and amount first.

## Update or Delete

`PATCH /api/v1/fixed-assets/{asset_id}` edits descriptive fields (`name`, `description`, `asset_number`, `serial_number`, `location`, `notes`, `category_id`, `vendor_id`) and, while the asset is still a draft, its depreciation settings — cost, useful life and method are locked once the asset is in service.

`DELETE /api/v1/fixed-assets/{asset_id}` removes an asset that has no posted depreciation. Add `?force=true` to also remove its depreciation entries and every journal entry posted for it (capitalization, depreciation, disposal) — for assets that were set up by mistake.
