Skip to main content

Assets

MethodPathDoes
GET/assetsList assets
POST/assetsCreate an asset
GET/assets/{id}One asset
PATCH/assets/{id}Rename or re-number an asset
POST/assets/{id}/check-outCheck out to a custodian
POST/assets/{id}/check-inCheck back in
POST/assets/{id}/retireRetire an asset
GET/assets/{id}/eventsAn asset's timeline
POST/correlationsLink a tag to an asset, or swap its tag

See Assets for how check-out and missing detection behave.

The asset object​

{
"id": "7a1b2c3d-4e5f-4a6b-9c8d-7e6f5a4b3c2d",
"assetTagNumber": "TL-0042",
"name": "Torque wrench 3",
"category": "Tools",
"status": "checked_out",
"custodian": "J. Patel",
"checkedOutAt": "2026-10-10T07:02:00.000Z",
"expectedReturnAt": "2026-10-10T17:00:00.000Z",
"epc": "E2801160600002084F1A3C99",
"zoneId": "9d2e4f60-1a3b-4c5d-8e7f-6a5b4c3d2e10",
"zoneName": "Tool Crib",
"inZoneSince": "2026-10-10T06:55:12.000Z",
"lastSeenAt": "2026-10-10T06:58:40.000Z"
}

status is available, checked_out, missing or retired. epc is the tag currently linked to the asset. The location fields (zoneId, zoneName, inZoneSince, lastSeenAt) come from that tag and are absent until it has been seen.

List assets​

GET /assets

All assets except retired ones, sorted by name, up to 500.

Create an asset​

POST /assets
{ "name": "Torque wrench 3", "assetTagNumber": "TL-0042", "category": "Tools", "epc": "E2801160600002084F1A3C99" }

name and assetTagNumber are required. epc is optional. If you include it, the tag is linked straight away, and if that tag is already being seen somewhere, the asset's location is filled in immediately. Send the EPC in uppercase. Returns 201 with the asset.

Update an asset​

PATCH /assets/{id}
{ "name": "Torque wrench 3 (calibrated)", "category": "Calibrated tools" }

Send any of name, assetTagNumber or category. Fields you leave out are unchanged. Returns the asset.

Check out​

POST /assets/{id}/check-out
{ "custodian": "J. Patel", "expectedReturnAt": "2026-10-10T17:00:00Z" }

Both fields are optional. This works on assets that are available or missing, and otherwise returns 409. Returns the asset.

Check in​

POST /assets/{id}/check-in

No body. Clears the custodian and sets the asset back to available. Returns 409 if the asset isn't checked out.

Retire​

POST /assets/{id}/retire

No body. The asset leaves the list and is never marked missing again, its history is kept and its tag is released for reuse. Returns 409 if it's already retired.

Timeline​

GET /assets/{id}/events
[
{ "id": "…", "kind": "zone_enter", "zoneId": "9d2e…", "zoneName": "Tool Crib", "occurredAt": "2026-10-10T06:55:12.000Z", "meta": { "zoneName": "Tool Crib" } },
{ "id": "…", "kind": "check_out", "occurredAt": "2026-10-10T07:02:00.000Z", "meta": { "custodian": "J. Patel" } }
]

kind is one of created, check_out, check_in, zone_enter, zone_exit, marked_missing, found or retired. meta carries extra detail where there is any: the name on created, the custodian on check_out, the zone name on zone_enter. An edit made with PATCH is currently recorded as created with "meta": {"updated": true}.

Tags get damaged and replaced. To attach a new tag to an existing asset:

POST /correlations
{
"epc": "E2801160600002084F1A3CA0",
"targetType": "asset",
"targetId": "7a1b2c3d-4e5f-4a6b-9c8d-7e6f5a4b3c2d",
"label": "Torque wrench 3",
"supersede": true
}
Field
epcThe new tag. Uppercase hex.
targetType"asset".
targetIdThe asset's id.
labelThe name to show for this tag. Use the asset's name.
supersedetrue ends any link this tag already has. Without it, a tag that's already linked returns 409.

Returns 201. Retire or re-tag the old tag as you see fit. Its history stays with it.