Asset import (CSV and API)

Load the assets no agent can reach: header auto-mapping, the asset_tag → serial → hostname match precedence, dry runs that provably change nothing, the agent-facts-always-win rule, and the enrollment merge.

itamimportcsvapiupsertasset-tagserialhostnamedry-runmergeenrollmentcustodianlocationidempotent

The assets no agent can reach

Printers, switches, monitors, machines still in a cupboard, contractors' kit, anything an agent cannot be installed on — every estate has them, and most organizations already track them in a spreadsheet. Without a way to load that spreadsheet, VerOps could only ever be a partial inventory.

Asset import brings those records in, reconciles them against what your agents already see, and — crucially — merges them into a single asset when an agent later shows up on the same machine.

Two entry points, one engine

Path Use it for
CSV wizardImport on the Hosts tab Spreadsheets of record, one-off loads, periodic reconciliation.
JSON upsert API Continuous sync from an external system of record.

Both run through the same matching and planning engine, so the API and the CSV cannot drift apart in behaviour.

The wizard

  1. Upload your CSV.
  2. Map columns. Headers are auto-mapped against a large alias list — Asset Tag, asset_tag, ASSETTAG, Service Tag, Assigned To and many more all resolve on their own. Override any column by hand; anything VerOps could not place is reported back to you rather than silently dropped.
  3. Preview. A full dry run showing every row as created, updated, no change or error, with the exact fields each row would change and a downloadable error report.
  4. Commit. Only now is anything written.

Commit is blocked until you have mapped at least one column VerOps can match on. The parser handles quoted fields, embedded commas and newlines, escaped quotes, CRLF or LF endings and a UTF-8 byte-order mark — real spreadsheet exports, in other words.

A dry run provably changes nothing. No asset, tag, timeline event or financial record is touched. Its only trace is a row in the import job history recording that the dry run happened — which is worth keeping as an audit trail of who tried what. Committing re-plans the file from scratch rather than trusting the preview, so a change made between preview and commit cannot slip through unexamined.

Match precedence

Every row is matched against your existing assets in strict order:

  1. Asset tag
  2. Hardware serial number
  3. Normalized hostname

The first key that finds exactly one candidate wins. No match at all creates a new asset with origin Imported.

Serial matching searches every place a serial is recorded — both the enrollment record and the hardware facts an agent reported — and de-duplicates the result, so a serial recorded through either path is found. Hostnames are normalized before comparison: lowercased, trailing dot removed and the DNS domain dropped, so the short name in your spreadsheet matches the fully-qualified name the agent reports.

Ambiguity is an error, never a guess. If a serial or short hostname is held by two or more assets, that row fails with an error you can fix — VerOps does not fall through to a lower-precedence key and it does not pick one. Silently merging two real assets, or quietly writing to the wrong one, is far worse than a line in an error report.

Agent facts always win

This is the rule that makes import safe to run against a live estate:

  • An import may fill in a blank hardware, OS or identity field — serial, manufacturer, model, OS type and version, CPU model, core count, memory.
  • An import can never overwrite a value an agent reported. Import a CSV claiming 8 GB of RAM for a machine the agent says has 16 GB, and the 16 GB stands.
  • The hostname in an import is a matching key only — it never renames a live asset. The agent owns the hostname.

Import exclusively owns three fields — asset tag, custodian and location label — plus the financial fields. Those are yours; no agent will ever touch them.

Asset tag uniqueness

Asset tags are unique per organization and case-insensitive. Import A1 and then a file containing a1, and the second is an error row — not a second asset quietly holding the same physical label. Duplicates within a single file are caught too.

Idempotence

Re-importing an identical file produces zero created, zero updated and zero timeline events. Every row re-plans to no change because every value already matches. This is deliberate: it means you can safely re-run a nightly export without polluting the activity feed or triggering spurious alerts.

The enrollment merge

The most valuable behaviour in the whole feature. When you import an asset and an agent is later installed on that same machine, VerOps merges them into one asset rather than leaving you with a duplicate.

On enrollment — and again on the first report, so older agents are covered too — VerOps looks for an import-origin asset carrying the same serial number, falling back to the hostname. When it finds one:

  • the imported record becomes the agent's record — the same asset, keeping its identity, so its history, tags, relationships, usage, financials and asset tag all survive;
  • its origin flips from Imported to Agent;
  • an asset import merged event is written to its timeline.

The practical implication is a genuinely useful workflow: import your spreadsheet first, complete with asset tags, custodians, locations and purchase records, then roll out agents. As each machine enrolls it lands on the record you already prepared, fully furnished, instead of appearing as a bare new host you then have to reconcile by hand.

The merge can never break enrollment: if it cannot be performed for any reason, the agent enrolls and reports normally and you simply have two records to reconcile.

A minimal CSV

asset_tag,serial,hostname,custodian,location
A-1042,5CG1234ABC,LT-FIN-014,Jane Smith,London HQ / 3rd floor
A-1043,5CG1234ABD,LT-FIN-015,R. Patel,London HQ / 3rd floor
A-2001,,SW-CORE-01,Network team,London HQ / comms room

The third row is a switch with no serial and no agent — exactly the kind of asset this feature exists for.

Job history

Every import — dry run or commit — is recorded with its filename, status, row counts and a downloadable row-level error report. That history is the audit trail for how records entered your estate.

Note: Import creates and updates hosts. MDM-ingested devices such as tablets stay MDM-owned and are never created or modified by an import. CSV is the supported spreadsheet format; XLSX files should be exported to CSV first.