## Overview

The Tool Inventory importer creates or updates inventory records for tools (parts with the **tool** part type). It works like the [Part Inventory importer](https://docs.firstresonance.io/administration/ion-importers/part-inventory), where rows without an `id` create new inventory and rows with an `id` update the matching record, with two tool-specific additions: `last_maintained_date` and `uri`. Because tools are always serial-tracked, **every create row must provide a `serial_number`** matching the physical asset’s tag or manufacturer serial. There is no serial autogeneration and no lot tracking for tool inventory.

## Columns

| Column                 | Required                     | Description                                                                                                                                                        |
|-----------------------|------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `id`                  | No                           | Inventory ID. Provide to update an existing record; omit to create new inventory. **Lookup column**: an empty cell is treated as “not provided,” not `0`.       |
| `part_number`        | Yes (for create)            | Part number of the tool. Ignored on update.                                                                                                                    |
| `revision`           | No                           | Tool revision. Combined with `part_number` to look up the tool; if omitted, the latest revision is used.                                                         |
| `serial_number`      | Yes (for create)            | Serial number identifying the physical tool. Update rows inherit the existing serial.                                                                            |
| `location`           | No                           | Location name. Must match an existing location in ION.                                                                                                          |
| `last_maintained_date` | No                         | Date the tool was last maintained, in ISO 8601 format, such as `2026-05-01` or `2026-05-01T12:30:00`. An empty cell leaves the field unset.                     |
| `uri`                | No                           | Link to the physical asset, such as an asset-management URL. Must be unique across tool inventory; an empty cell stores no value.                               |

`last_maintained_date` only accepts ISO 8601. Ambiguous formats like `1/2/3` are rejected rather than guessed.

## Custom attributes

Any column not in the standard list above is treated as a custom attribute on the inventory record. Custom attribute columns must match a configured attribute key for your organization; unknown columns cause a validation error.
