Which API host?
| Caller | Gate snapshot | Fulfill |
|---|---|---|
SDK (NeusClient) | client.getGate(gateId) | client.fulfillGate(...) |
api.neus.network | GET /api/v1/profile/gates/{gateId} | POST /api/v1/profile/gates/{gateId}/fulfill |
neus.network (browser) | GET /api/v1/gates/{gateId} | POST /api/v1/gates/{gateId}/fulfill |
neus.network paths are the same contract, proxied for same-origin browser calls.
Lifecycle
- Snapshot — load the public gate: requirements, price, schedule, and reward presence (not the secret reward value). Use
client.getGate(gateId)orGET /api/v1/profile/gates/{gateId}onapi.neus.network. - Eligibility —
GET /api/v1/proofs/check?gateId=...&address=...&includePrivate=true&includeQHashes=trueevaluates the visitor’s existing proofs against every requirement. - Verify — if checks are missing, the visitor completes them (hosted verify link, VerifyGate, or
POST /api/v1/verificationfor signature-based checks). PassgateIdand reuse satisfied checks viaoptions.reusedVerifierProofs. - Pay — for paid gates, payment happens after verification by default (
executionOrder: "verifyThenCharge"), by card (Stripe) or USDC on Base. - Fulfill — deliver the reward with the verified receipt (
client.fulfillGate(...)orPOST /api/v1/profile/gates/{gateId}/fulfillonapi.neus.network).
Reading the gate check
WhengateId is passed, the response carries a per-requirement data.gate block. gate.allRequiredSatisfied === true is the only signal that checkout is ready. Top-level eligible and matchedCount exist for criteria-only checks and must not be used as gate readiness on their own.
satisfiedVerifierIds/missingVerifierIds— which requirements existing proofs cover.reusedVerifierProofs— verifierId → qHash map (requiresincludeQHashes=true). Pass it asoptions.reusedVerifierProofsonPOST /api/v1/verificationso satisfied checks are not re-run.- Re-run the gate check after every interactive step (OAuth grant, personhood session) before treating checkout as complete. Interactive completions only count once the protocol confirms them here.
Request-time vs proof-backed rules
Each requirement carriesmatch rows ({ path, op, value }). They are enforced at two different moments:
| Rule type | Examples | Enforced |
|---|---|---|
Request-time (eq on input fields) | domain, contractAddress, chainId, minBalance, provider | When the verification request is submitted — the locked value must match exactly |
Proof-backed (traits.*, claims.*, risk fields, gte/lte) | claims.age_min, claims.liveness_verified, riskLevel, overallRisk | After verification, against the verifier’s output |
claims.age_min ≥ 21 — the visitor is asked to complete a stronger check, and the new proof carries the extra claims.
Note for wallet-risk gates: any proof-backed row also requires the proof’s policyVerified to be true — a risk proof that failed its own policy never satisfies a gate.
Paid gates
The snapshot’smonetization.charge describes pricing:
amountUsd,label,methods(usdc,stripe),cardPayoutReadyexecutionOrder—verifyThenCharge(default): verification completes first, then payment, then fulfill.
- Card —
paymentCheckoutSessionIdfrom the Stripe checkout return. - USDC —
paymentTxHashof the on-chain transfer.
gateId + qHash pair and cannot be reused for another checkout (409 PAYMENT_ALREADY_USED).
Fulfillment result
fulfillment.delivery is one of access_granted, redirect, download, or reveal. The secret value appears only here — after verification (and payment) succeeded for the caller’s wallet.
Campaign windows
Gates may carry aschedule (startsAt / endsAt). Outside the window, gate checks report the closed state and verification/fulfillment are refused server-side (GATE_NOT_STARTED, GATE_ENDED). Treat the window as enforced — it is not a UI-only hint.
Next
VerifyGate widget
Drop-in checkout for published gates
Pricing
Plans and credits
Billing
How verification and checkout charges work
API overview
Full HTTP API surface
Verifier catalog
Every check a gate can require