Verification
NEUS proofs are created by signing a deterministic request and submitting it to the API. The API returns a Proof ID (wire field: qHash) you can use for status checks and gating.
Flow
Sign the Standard Signing String (Signing).
Create a proof (
POST /api/v1/verificationorNeusClient.verify(...)).Check status (
GET /api/v1/verification/status/{qHash}orNeusClient.getStatus(...)/pollProofStatus(...)).Use the Proof ID for gating and downstream integrations.
Proof ID (qHash)
The Proof ID is the stable identifier for a proof record. In the API and SDK payloads, this identifier appears as qHash.
Treat the Proof ID as an opaque value:
Store it
Pass it between systems
Use it to fetch status and gate access
For the canonical terminology, see Glossary.
Freshness and timestamps
A Proof ID identifies a proof record; it is not a “run ID”.
Use timestamps like
createdAt,completedAt, and/orlastUpdated(surface-dependent) to reason about freshness.For point-in-time verifiers (balances, ownership, risk), enforce freshness using your chosen gating strategy (see Gating).
Chain context
EVM (default): provide
chainId(number) and sign using EIP-191 (personal_sign).Universal (preview): provide
chain(CAIP-2namespace:reference) +signatureMethodfor non-EVM signers.
Important separation:
The request
chainId/chainis the signing context (bound into the signature).Some verifiers also require their own chain context inside
data(e.g.,data.chainIdfor on-chain reads). Thisdata.chainIdis input-selected and may be testnet or mainnet, depending on where the target data lives.
Verifier input shape (single vs multi-verifier)
Single verifier:
datacan be a flat object (verifier input).Multi-verifier: prefer namespaced payloads:
data[verifierId] = { ... }to avoid field collisions (contractAddress,chainId,content, etc.).
Subject wallet defaults
Many verifiers accept an explicit subject wallet field (e.g., ownerAddress, walletAddress) but default it to the signed walletAddress when omitted. If you provide a mismatched subject wallet, the server will enforce signature binding and will not allow subject overrides that break the signed request intent.
Status model
For integrations, treat statuses as:
processing: verification is in progress
verified*: verification succeeded
rejected/error**: verification failed
For the full status enum, see docs/api/public-api.json (OpenAPI) or the SDK VerificationStatus type.
Privacy
Proof visibility is controlled by:
options.privacyLevel:private|publicoptions.publicDisplay: discoverability toggle for public proofs
Recommended defaults:
privacyLevel: 'private'publicDisplay: falsestoreOriginalContent: false
For owner-only reads of private proofs, see the API reference section “Private proof access (owner-only)”.
For third-party apps, NEUS also supports explicit private proof sharing without making a proof public:
The owner creates an access grant (
POST /api/v1/verification/access/grant)The viewer reads with a short-lived viewer signature on
data.action="access_private_proof"(no session cookie required)
Last updated
Was this helpful?

