Skip to main content
This page is for your first direct-sign proof with ownership-basic. Flows that need social, human, or org interaction start in Hosted Verify; reusable gate flows follow Integration. Before production traffic, complete Get started for appId, credits, and who pays.

1. Install the SDK

npm install @neus/sdk

2. Create a proof

Raw client.verify() defaults to private, unlisted, and stored content (owner-authenticated reads). Omit options unless you need a different mode. VerifyGate uses different create defaults; see Widgets and Security and trust.
import { NeusClient } from '@neus/sdk';

const client = new NeusClient({
  appId: 'your-app-id', // optional for local try; required for production — [Get started](./get-started)
});

const proof = await client.verify({
  verifier: 'ownership-basic',
  content: 'My content or claim',
  wallet: window.ethereum,
});

const proofId = proof.proofId;
Attestation vs gate: this snippet is for proving content. See SDK verification patterns for more shapes. No injected wallet? Use Hosted Verify instead of window.ethereum. Social, org, or human verification? Start in Hosted Verify, not here.

3. Wait for completion

const status = await client.pollProofStatus(proofId, {
  interval: 3000,
  timeout: 60000,
});

4. Gate content in React

For gates, VerifyGate defaults to unlisted public create mode so checks align without extra options. Override proofOptions when you need listed public or private behavior. See VerifyGate and Integration.
import { VerifyGate } from '@neus/sdk/widgets';

<VerifyGate
  appId="your-app-id"
  requiredVerifiers={['ownership-basic']}
>
  <ProtectedContent />
</VerifyGate>

5. Check eligibility from your server

const result = await client.gateCheck({
  address: '0x...',
  verifierIds: ['ownership-basic'],
});

if (result.data?.eligible) {
  // allow access
}

Next

Production (appId, billing)Get started
Other ways to integratePaths
Ship loopIntegration