Verity
Verify

How a humanity check is confirmed

Illustrative — not a live verifier. This page animates a proof-of-concept to show how a check works. It does not read a real receipt, and it does not perform a live StarkNet read — nothing here talks to a server.

A consumer confirms a humanity claim two ways — and the two are not the same confirmation. Here is what each one actually checks.

  1. A signed receipt arrives: receipt.sig = 0x9f…c2
  2. You check the signature offline: verify(receipt) …
  3. The claim resolves: is_human → true

An illustrative sequence — not a live check. It shows the shape of an offline receipt verification; it does not verify a real receipt.

Two confirmations, not one

What each path actually checks

Read is_human(address) on StarkNet

Operator-key-bound · issuer-rooted

Anyone can read the contract. In this build the answer is operator-relayed, so the chain trusts the operator issuer key — it is operator-asserted, not a device-key proof.

Verify a signed Ed25519 receipt offline

User-key-bound · TEE-rooted

Every check leaves a signed receipt you can verify yourself, offline, without calling our API. You check the signature against the device/TEE key — no round-trip to Verity.

Attribution, not authentication. These are distinct confirmations of different facts — one operator-key-bound on the chain, one user-key-bound in the receipt. We never flatten the two into a single "trusted" word.

Request a pilot

Want to try it for real?

A pilot runs the real on-device proof generation against a hosted, honestly-labelled demo build. Tell us what you would gate on a human.