Skip to content

Bulk import

Bulk import provisions a whole factory batch in one shot. You upload a CSV of hardware IDs and profile assignments; the platform validates each row, creates the provisioning records, and hands you back a one-time encrypted manifest of the generated keys to ship to the factory. Each device then comes online on its own via the key claim flow.

This is the path for hundreds or thousands of devices. For a single device, use manual registration.

  1. Prepare a CSV of the batch — one row per device.
  2. Upload it as a tenant admin. Each row is validated independently.
  3. Review the result — created records, plus a per-row report of any failures and duplicates.
  4. Download the encrypted manifest of generated provisioning keys (shown once).
  5. Distribute the manifest to the factory; keys are burned into devices.
  6. Devices claim themselves on first boot per the key claim flow.

One row per device. The header row names the columns; order does not matter.

ColumnRequiredDescription
hardware_idyesStable hardware identifier; unique within the tenant
profile_idyesDevice profile the device inherits
namenoHuman-readable device name
groupsnoGroup names; separate multiple with ;
tagsnokey=value pairs; separate multiple with ;
hardware_id,profile_id,name,groups,tags
AA:BB:CC:00:11:01,p_temp_sensor_v2,Cold Store Sensor 001,cold-store;floor-1,region=eu;line=A
AA:BB:CC:00:11:02,p_temp_sensor_v2,Cold Store Sensor 002,cold-store;floor-1,region=eu;line=A
AA:BB:CC:00:11:03,p_temp_sensor_v2,Cold Store Sensor 003,cold-store;floor-2,region=eu;line=B
AA:BB:CC:00:11:04,p_humidity_v1,Humidity Probe 001,cold-store;floor-2,region=eu;line=B

Every row is validated on its own. Validation checks include:

  • hardware_id is present and well-formed
  • profile_id references a profile that exists in your tenant
  • hardware_id is not already taken in the tenant (duplicate detection)

With partial import enabled, valid rows are imported even if other rows fail — the import does not abort on the first bad row. The result reports outcomes per row so you can fix and re-upload only the failures:

{
"imported": 498,
"failed": 2,
"rows": [
{ "row": 312, "hardware_id": "AA:BB:CC:00:12:38", "status": "duplicate", "reason": "hardware_id already exists in tenant" },
{ "row": 457, "hardware_id": "", "status": "invalid", "reason": "hardware_id is required" }
]
}

On success the platform generates the provisioning keys for the batch and returns them as a one-time, encrypted manifest. Like every raw secret on CORE-M, the keys are shown once — only their SHA-256 hashes are stored.

Distribute the manifest to your factory or contract manufacturer over a secure channel. Each device gets its provisioning key flashed during manufacture.

Once a device boots in the field with its provisioning key, it claims its identity exactly as described in the key claim flow: it calls POST /api/v1/provision, the platform derives the tenant from the key, creates (or idempotently returns) the device, and issues its API key. From the device’s perspective, bulk import is invisible — it just claims and connects.