Skip to main content

What is a unit?

A unit is the digital identity of a single physical item - its digital twin and its certificate of authenticity. Even if two items are identical SKUs (same product, same size, same color), each one is its own unit with its own identity, its own chip, and its own issuance history. Units live inside a collection. A collection defines the group (a product line, a drop, a release); a unit is one item within it.

Why units matter

  • Register items. Create a unit for each physical item when it enters your workflow - before it ships, before it’s paired to a chip.
  • Map to your inventory. Use external_id to tie each unit back to your own SKU, order line, or serial number. Filter lists by external_id to look up units without storing Endstate IDs.
  • Track issuance. A unit’s collection.token.status tells you whether the item has been issued - pending means the unit exists but has no chip yet; active means a chip is paired and the unit has a collection.token.serial within its collection.
  • Verify on tap. When a user taps an NFC chip, the API returns the unit record attached to it. That record is what you display, validate, or act on.

Unit object

string (UUID)
The unit’s unique identifier. Stable; use this as your durable reference in Endstate.
string | null
Your own identifier for this item - SKU, order line ID, serial number, or any string you choose. Must be unique within your environment if provided. Null if not set.
string | null
A human-readable label for the item (e.g. "Black Hoodie - Size M"). Optional; null if not set.
string | null
A plain-text description of the item. Null if not set.
object | null
Free-form JSON you attach to this unit. Use this for any item-level metadata that does not have a dedicated field - color, size, batch number, custom fields. No enforced schema; store whatever your integration needs.
string | null
Where a user is sent after tapping this unit’s chip. Overrides the collection and organization-default redirects. Null if not set - resolution then falls through to the collection redirect, then your organization default. See Tap redirects.
string (ISO-8601)
When the unit was created.
object
The collection this unit belongs to.
array
The NFC chips paired to this unit. Most units have exactly one chip; the array is empty until a chip is paired.

Create a unit

POST /v1/units
string (UUID)
required
The ID of the collection this unit belongs to. The collection must already be provisioned (contract.status: "active"). Required.
string
Your own identifier for this item. Must be unique within your environment. Optional.
string
A human-readable label for the item. Optional.
string
A plain-text description of the item (1–10,000 characters). Optional.
object
Free-form JSON metadata to attach to the unit. Optional.
string
Where a user is sent after tapping this unit’s chip. Must be a valid absolute URL. Optional - you can also set or change it later with PATCH /v1/units/ {unit_id}. See Tap redirects.

Example

The unit is returned at the top level, like every single-resource response - see Response shape. It is created with collection.token.status: "pending"; no serial is assigned yet - that happens when a chip is paired. See Lifecycle below.

Update a unit

PATCH /v1/units/{unit_id}
string
Your own identifier for this item. Must be unique within your environment; a value another unit already uses returns unit.already_exists, and the unit does not change. Cannot be cleared.
string
A human-readable label for the item. Send null to clear.
string
A plain-text description of the item (1–10,000 characters). Send null to clear.
object
Free-form JSON metadata for the unit. Replaces the full attribute set - there is no merge, so send every key you want to keep. Send null to clear.
string
Where a user is sent after tapping this unit’s chip. Send null to clear. See Tap redirects.

Example

Send only the fields to change - a field you leave out keeps its value. The body must contain at least one field; an empty body returns validation.failed. All sent fields change in one write, or none change.

Lifecycle

Units move through a simple two-state lifecycle:
1

Create the unit

POST /v1/units - the unit is created with collection.token.status: "pending" and an empty chips array. No serial number yet.
2

Pair a chip

POST /v1/chips with unit_id and the chip’s identifiers. Pairing links the physical item to its digital record and triggers issuance.
3

Unit is issued

Issuance is asynchronous. Poll GET /v1/units/{unit_id} until collection.token.status is "active". When active, collection.token.serial holds the unit’s serial number within the collection.
Poll GET /v1/units/{unit_id} to check issuance status.

Endpoints

These endpoints take an API key, with two exceptions: claim and transfer creation require a session token (status polling takes either), and the single-unit fetch accepts either credential - a session token reads only the unit it was issued for. See Credentials for header format and credential types. For full request/response schemas, see the API reference.

Next steps

Chips

Pair an NFC chip to a unit to complete its digital record and trigger issuance.

Collections

Understand how collections group units and define the serial-number namespace.

Tap redirects

Send a user to your own destination after they tap this unit’s chip.