Skip to main content
This guide walks the full ownership-transfer journey: a user taps an item, you verify the tap, and you hand the unit to a recipient wallet. For the field-level reference, see the Claims concept page. A claim is authorized by a tap — you cannot transfer a unit with an API key alone. The session token from a recent tap of that unit’s chip is what proves a real person is holding the product.

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 get unit.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 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.
Use the 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 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.
Endstate signs the transfer authorization for the unit’s token. What happens next depends on 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

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 on error.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.