Hanzo
OpenapiValidator

Claims a validator slot and provisions its node, after proving the caller's…

Claims a validator slot and provisions its node, after proving the caller's wallet owns the slot's NFT.

POST /v1/validator

Addresshttps://api.hanzo.ai/v1/validator
MethodPOST
Operationpost_validator
AuthAuthorization: Bearer $HANZO_API_KEY

Claims a validator slot and provisions its node, after proving the caller's wallet owns the slot's NFT.

The pipeline, all server-enforced: burn the single-use challenge (so a replayed or forged nonce dies before any chain read), recover the signer from the message this server rebuilds, require that wallet to hold Validator-tier GenesisNFT #tokenId on Ethereum mainnet, generate a fresh luxd staking identity and seal it into KMS, write a LuxNetwork CR for a NEW node, and ENQUEUE an owner-gated registration. The registration is never auto-submitted to any P-Chain — the owner co-signs it out of band — and the stake weight is set at co-sign time, never derived from the NFT.

It fails CLOSED at every gate: a bad signature, a non-owner, a non-tier slot or an unavailable KMS all leave no claim persisted and no key material exposed. Re-claiming a slot this org already holds re-applies the node CR and returns 200 with the existing identity (keys and NodeID are stable); a slot held by another org is 409. A cluster-less deployment still claims the slot, seals the keys and queues the registration, reporting the node as "node_pending".

Request

3 fields, body application/json (required).

FieldInTypeRequiredDescription
noncebodystringNonce is the value GET /v1/validator/challenge issued for this slot.
signaturebodystringSignature is the wallet's personal_sign over the challenge message, hex with a 0x prefix.
tokenIdbodyintegerTokenID is the Validator-tier GenesisNFT token id being claimed.

Response

StatusBodyMeaning
200slotViewok

200 body — 15 fields.

FieldInTypeAlwaysDescription
blsPubkeybodystringBLSPubkey is the node's BLS public key, hex.
crNamebodystringCRName is the LuxNetwork custom resource that materializes the node.
createdAtbodyintegerCreatedAt is when the slot was first claimed, as a Unix timestamp.
namespacebodystringNamespace is the Kubernetes namespace the node's CR lives in.
networkbodystringNetwork is the luxd network slug the node joins.
nodeIDbodystringNodeID is the luxd node id derived from the sealed staking identity.
nodeStatusbodystringNodeStatus is the provisioning state of the node: "node_created" once the CR is applied, "node_pending" when no cluster is reachable (the slot is still claimed…
registrationbodyregistrationView
registration.idbodystringID is the registration's handle.
registration.nodeIDbodystringNodeID is the luxd node the registration is for.
registration.statusbodystringStatus is the registration's lifecycle state; "pending_owner_approval" until the owner co-signs it out of band.
slotbodyintegerSlot is the validator slot number — the same value as tokenId, under the name the portal reads.
tokenIdbodyintegerTokenID is the GenesisNFT token id that IS this slot.
updatedAtbodyintegerUpdatedAt is when the slot last changed, as a Unix timestamp.
walletbodystringWallet is the lowercase Ethereum address that proved ownership of the NFT.

Failure carries the platform error shape — see Errors.

Examples

hanzo validators create

Validator API · All Hanzo APIs · Interactive reference

How is this guide?

On this page