Default Recommendation
Use hosted /verify or the SDK unless you explicitly need low-level signing control.
Why This Exists
The signature proves the wallet actually approves the verification request. That is what lets NEUS issue a reusable proof receipt instead of trusting a client-side claim.
Low-Level API Path
Get the exact signing string from NEUS
Call POST /api/v1/verification/standardize
Sign that exact string with the user's wallet
Sign the returned signerString
Submit the verification request
Submit the same normalized request body to POST /api/v1/verification
This is an implementation detail for low-level clients. If you want the simplest product path, use hosted verify and avoid exposing this flow directly in your UX.
The server returns a deterministic six-line string from POST /api/v1/verification/standardize. Sign that exact string:
NEUS Verification Request
Wallet: <address>
Chain: <chainId or CAIP-2 chain>
Verifiers: <comma-separated-ids>
Data: <standardized-json>
Timestamp: <unix-ms>
Do not hand-author or edit this message. Always sign the exact server-returned string.
SDK Path
Use standardizeVerificationRequest(...) from @neus/sdk when you need the low-level flow without managing normalization yourself.
Supported Wallets
| Type | Standard | Description |
|---|
| EOA | EIP-191 | Standard personal_sign (MetaMask, Coinbase, Rainbow) |
| Smart Contract | EIP-1271 | Contract wallets (Safe, Argent, Sequence) |
| Counterfactual | EIP-6492 | Pre-deployed smart accounts not yet on-chain |