Assets
| Method | Path | Does |
|---|---|---|
GET | /assets | List assets |
POST | /assets | Create an asset |
GET | /assets/{id} | One asset |
PATCH | /assets/{id} | Rename or re-number an asset |
POST | /assets/{id}/check-out | Check out to a custodian |
POST | /assets/{id}/check-in | Check back in |
POST | /assets/{id}/retire | Retire an asset |
GET | /assets/{id}/events | An asset's timeline |
POST | /correlations | Link 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}.
Link a tag to an asset, or replace its tag
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 | |
|---|---|
epc | The new tag. Uppercase hex. |
targetType | "asset". |
targetId | The asset's id. |
label | The name to show for this tag. Use the asset's name. |
supersede | true 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.