Skip to main content

Verification Lifecycle

Lifecycle stages

StageMeaningPrimary surface
Request assembledVerifier IDs, subject, and verifier data are preparedSDK or API
Standardized for signingServer returns deterministic signerString when neededPOST /api/v1/verification/standardize
Verification submittedRequest is accepted for executionPOST /api/v1/verification
Verification processingAsync verifier is still resolvingPoll status
Verification completeProof receipt is ready for reuseStatus endpoint, SDK result, widget callback
Reused for policyGate, app, API, or agent consumes the receiptProof checks, status, widgets, MCP
Revoked or expired by policyProof is no longer acceptable for the target actionRevocation route or freshness rule

Reuse strategy

StrategyWhat it doesUse when
reuse-or-createReuse an existing eligible proof, otherwise create oneDefault product UX
reuseOnly check existing proofsRead-only access checks
freshAlways force new verificationHigh-stakes actions

Freshness guidance

  • Use a recency window for point-in-time verifiers such as balances, risk, and ownership.
  • Treat status checks as cheap reads; only create new proofs when policy actually demands a fresh assertion.
  • Prefer since or sinceDays in gate checks instead of re-verifying on every request.

Revocation

If a user needs to invalidate a proof they own, use the self-revocation flow:
POST /api/v1/proofs/revoke-self/{qHash}
In the JavaScript SDK, the equivalent is:
await client.revokeOwnProof(proofId, wallet);