Reference
Technical documentation for NEUS Network integration.
Table of Contents
SDK Reference
Installation
npm install @neus/sdkBasic Usage
import { NeusClient } from '@neus/sdk';
// In browser apps, prefer a same-origin server route to avoid CORS
const client = new NeusClient({ apiUrl: '/api/neus' });
const proof = await client.verify({
verifier: 'ownership-basic',
content: 'Hello NEUS'
});
// See also: Verifier pages → ./verifiers/ownership-basic.mdConfiguration
const client = new NeusClient({
apiUrl: 'https://api.neus.network', // Default (server-side). In browsers use /api/neus
timeout: 30000 // Request timeout in ms
});Methods
verify(params)
verify(params)Create verification proof.
Auto Mode (Recommended):
const proof = await client.verify({
verifier: 'ownership-basic',
content: 'Content to verify'
});
// Pitfalls: address normalization and timestamp window; see ./api/README.md#troubleshootingManual Mode (Advanced):
const proof = await client.verify({
verifierIds: ['ownership-basic'],
data: { content: 'Content', owner: walletAddress },
walletAddress: '0x...',
signature: '0x...',
signedTimestamp: Date.now()
});getStatus(qHash)
getStatus(qHash)Get verification status.
const status = await client.getStatus(qHash);
console.log('Success:', status.success);
console.log('Status:', status.data.status);
// See also: Polling helper → `pollProofStatus`getPrivateStatus(qHash, wallet)
getPrivateStatus(qHash, wallet)Access private proof with wallet signature.
const privateData = await client.getPrivateStatus(qHash, window.ethereum);pollProofStatus(qHash, options)
pollProofStatus(qHash, options)Wait for verification completion.
const finalStatus = await client.pollProofStatus(qHash, {
interval: 3000,
timeout: 60000,
onProgress: (status) => console.log('Status:', status.status)
});
// See also: API status endpoints → ./api/README.mdHTTP API
Authentication
All requests require wallet signatures (EIP-191). See also: Message format and helpers → ./api/README.md#standard-message-format
Standard Signing String Format
NEUS Verification Request
Wallet: {lowercase_wallet_address}
Chain: {chain_id_number}
Verifiers: {verifier1,verifier2,...}
Data: {deterministic_json_string}
Timestamp: {unix_milliseconds}Endpoints
Create Verification
POST /api/v1/verificationRequest:
{
"verifierIds": ["ownership-basic"],
"data": {"content": "Hello", "owner": "0x..."},
"walletAddress": "0x...",
"signature": "0x...",
"signedTimestamp": 1678886400000,
"chainId": 84532,
"options": {"privacyLevel": "private"}
}See also: Privacy and options → ./PRIVACY.md
Get Status
GET /api/v1/verification/status/{qHash}Build Signing String (Helper)
POST /api/v1/verification/standardizeOptional helper to get the exact string format if needed for troubleshooting.
Diagnose Issues
POST /api/v1/verification/diagnoseDebug signature verification problems.
Verifier Specifications
ownership-basic
Purpose: Content ownership verification
Required Fields:
content(string) - Content to verifyowner(address) - Owner wallet addressreference(object) - Reference informationtype(string) - Reference type: url, ipfs, tx, otherid(string) - Reference identifier
Example:
{
verifier: 'ownership-basic',
data: {
content: 'My original article',
owner: '0x...',
reference: { type: 'url', id: 'https://example.com' }
}
}nft-ownership
Purpose: NFT ownership verification
Required Fields:
ownerAddress(address) - NFT owner walletcontractAddress(address) - NFT contract addresstokenId(string) - NFT token IDchainId(number) - Blockchain chain ID
Optional Fields:
tokenType(string) - 'erc721' or 'erc1155' (default: 'erc721')
Example:
{
verifier: 'nft-ownership',
data: {
ownerAddress: '0x...',
contractAddress: '0x...',
tokenId: '1234',
chainId: 1
}
}token-holding
Purpose: Token balance verification
Required Fields:
ownerAddress(address) - Token holder walletcontractAddress(address) - ERC20 contract addressminBalance(string) - Minimum balance (human-readable)chainId(number) - Blockchain chain ID
Example:
{
verifier: 'token-holding',
data: {
ownerAddress: '0x...',
contractAddress: '0x...',
minBalance: '100.0',
chainId: 1
}
}ownership-licensed
Purpose: Licensed content ownership verification
Required Fields:
content(string) - Licensed content description/titleowner(address) - License owner wallet addresslicense(object) - License NFT detailscontractAddress(address) - License NFT contracttokenId(string) - License token IDchainId(number) - Mainnet chain where license is verified (e.g., 1)ownerAddress(address) - Expected license holdertype(string, optional) - 'erc721' | 'erc1155' (default: 'erc721')
Optional Fields:
reference(object) - Reference to the licensed contenttype(string) - 'url' | 'ipfs' | 'tx' | 'other'id(string) - Reference identifier
Example:
{
verifier: 'ownership-licensed',
data: {
content: 'Pro Tools License',
owner: '0x...',
license: {
contractAddress: '0x...',
tokenId: '1',
chainId: 1,
ownerAddress: '0x...',
type: 'erc721'
}
}
}Privacy Controls
Privacy Levels
public- Anyone can see proof detailsprivate- Only wallet owner can access details
Options
{
options: {
privacyLevel: 'private', // public | private
publicDisplay: false, // Enable public UI display
storeOriginalContent: false, // Store content in proof
enableIpfs: false, // Create IPFS snapshot
targetChains: [11155111, 80002] // Cross-chain storage (testnet)
}
}Accessing Private Proofs
// Private proofs require a wallet signature from the proof owner
const privateData = await client.getPrivateStatus(qHash, wallet);Multi-Language Support
NEUS works with any programming language via HTTP API.
Universal Flow
Get Standard Signing String
Sign with your wallet library
Submit verification request
Language Examples
Multi-language signing utilities: See signing helpers in the repository: signing helpers
React Widgets
Installation
npm install @neus/widgetsVerifyGate
Gate content behind verification requirements.
import { VerifyGate } from '@neus/widgets';
<VerifyGate
requiredVerifiers={['nft-ownership']}
onVerified={(result) => console.log('Verified:', result.qHash)}
>
<PremiumContent />
</VerifyGate>Props:
requiredVerifiers- Array of verifier IDsonVerified- Callback when verification succeedsdisabled- Disable verification buttonstyle- CSS styles for container
ProofBadge
Display verification status with an optional status dot.
import { ProofBadge } from '@neus/widgets';
// In dev, pass a proof object to avoid cross-origin status fetches
<ProofBadge qHash="0x..." proof={{ status: 'verified' }} />
<ProofBadge qHash="0x..." size="md" showDot={false} />
<ProofBadge qHash="0x..." labelOverride="Verified Content" />Props:
qHash- Proof identifier (required)size- Badge size: 'sm' | 'md' (default: 'sm')showDot- Show status dot (default: true)labelOverride- Custom label textuiLinkBase- Base URL for proof links (default: 'https://neus.network')
Error Handling
Common Error Codes
4001- User rejected wallet signatureINVALID_WALLET_ADDRESS- Wallet address format incorrectSIGNATURE_INVALID- Signature verification failedVERIFIER_NOT_FOUND- Invalid verifier IDRATE_LIMIT_EXCEEDED- Too many requests
Error Handling Pattern
try {
const proof = await client.verify({
verifier: 'ownership-basic',
content: 'My content'
});
} catch (error) {
if (error.code === 4001) {
// User cancelled - handle gracefully
console.log('User cancelled verification');
} else {
// Technical error - show user-friendly message
console.error('Verification failed:', error.message);
}
}Debugging Signatures
If getting signature errors:
Use
/verification/standardizeendpointSign the exact returned string
Use
/verification/diagnoseif still failing
Contract Information
Deployments
Base Sepolia (Hub Chain - 84532):
NEUSVerifierRegistry:0x728Ba14b52d4811e2eDcE37c7e419AB47B0A17DfNEUSVoucherHub:0xD524bd93e51b29C63b921994BF2BA61f8f49FB6CNEUSToken:0xBe5F4fe3ba4C28DBfB5d9518b6F68F68844e3854
Cross-Chain Storage (Testnet):
Ethereum Sepolia (11155111):
0x4eE5346a253bA26508FC99FAa49932561205359CPolygon Amoy (80002):
0x5746f86E6BC6AcCF34286Bc8E8803CcAc4a0306dArbitrum Sepolia (421614):
0x0095E6e6A1CA0E05e56920aeaDc0c8bDDEADcdC1Optimism Sepolia (11155420):
0x24f9Af19693D163576ac49DF3b7a75934bB3B1b4
ABIs
Contract ABIs available at:
network/abis/NEUSVerifierRegistry.jsonnetwork/abis/NEUSVoucherHub.jsonnetwork/abis/NEUSVoucherSpoke.jsonnetwork/abis/NEUSToken.json
Support
Community Questions & Ideas: GitHub Discussions
Bug Reports: GitHub Issues
Technical Support: [email protected]
Security Issues: [email protected]
For quick integration, start with QUICKSTART.md.
Last updated
Was this helpful?

