Prerequisites
- The unit is issued (
token.status: "active"). A unit that has only been created but not paired to a chip cannot be claimed — you will getunit.not_minted. See Verify a unit for the setup and pairing flow. - You can collect the recipient’s wallet address (an EVM address) from the user.
1
Verify a tap to get a session token
The user taps the item’s chip. Your server verifies it with Use the
POST /v1/chips/{chip_id} and receives a session_token scoped to that chip and unit. This is the same call covered in Verify a unit.token string as the bearer credential for the claim. The token is short-lived — create the claim while it is still valid.2
Create the claim
Call Endstate signs the transfer authorization for the unit’s token. What happens next depends on
POST /v1/units/{unit_id}/claims with the recipient’s address and an execution mode, authorized by the session token. execution defaults to endstate_relay.execution — continue with whichever mode you chose.Only one claim can be open per unit at a time. A second attempt while one is
in flight returns
claim.in_progress. If the unit already belongs to the
recipient, you get claim.already_to_recipient.3
Settle the transfer
- endstate_relay (default)
- client_broadcast
Nothing more to do — Endstate submits the on-chain transaction for you. Skip
to the next step and poll for status.
4
Poll until claimed
Poll
GET /v1/units/{unit_id}/claims/{claim_id} until the claim reaches a terminal state. This endpoint accepts either your API key or the session token, so you can poll from your backend or a client.claiming— still in progress. Keep polling on a short interval.claimed— done. Ownership transferred and confirmed on-chain.expired/failed— terminal failures. Verify another tap and create a new claim.
Handling errors
Branch onerror.code:
See Errors for the full envelope.
Next steps
Claims
The full Claims reference: fields, execution modes, and status lifecycle.
Units
The unit you just transferred — its issuance lifecycle and fields.

