Integrate
Add IAM verification to your app in 5 lines of code.
Install
npm install @iam-protocol/pulse-sdkWalletless verification
Liveness-check tier for non-crypto users. The Pulse SDK generates a proof and submits via the IAM relayer. No wallet needed. The integrator optionally funds verifications via API key.
import { PulseSDK } from '@iam-protocol/pulse-sdk';const pulse = new PulseSDK({ cluster: 'devnet', relayerUrl: 'https://relayer.iam-protocol.org',});// User completes Pulse challenge on your siteconst result = await pulse.verify();if (result.success) { // result.commitment — the on-chain TBH hash grantAccess(result.commitment);}Wallet-connected verification
The primary verification flow. The user pays a small protocol fee (~0.005 SOL) and signs the transaction with their wallet. Your app reads the result on-chain for free.
import { PulseSDK } from '@iam-protocol/pulse-sdk';import { useWallet, useConnection } from '@solana/wallet-adapter-react';const pulse = new PulseSDK({ cluster: 'devnet' });const { wallet } = useWallet();const { connection } = useConnection();// User completes challenge, signs tx with walletconst result = await pulse.verify( touchElement, wallet.adapter, connection);if (result.success) { // result.txSignature — Solana transaction signature grantAccess(result.commitment);}Query on-chain identity.
This is what your integration reads. Paste any wallet address to see its IAM verification status, Trust Score, and history directly from Solana devnet.
Live on Solana devnet
Paste any wallet address to check its IAM verification status on-chain.
Try with: (IAM verified wallet on devnet)
Check if a wallet is human
Use this to verify if a wallet has a valid IAM attestation on-chain.
import { verifyIAMAttestation } from '@iam-protocol/pulse-sdk';import { useConnection } from '@solana/wallet-adapter-react';// Inside your component or API routeconst { connection } = useConnection();try { // attestation: { isHuman: boolean, trustScore: number, verifiedAt: number, mode: string, expired: boolean } | null const attestation = await verifyIAMAttestation(walletAddress, connection); if (!attestation || !attestation.isHuman || attestation.expired) { throw new Error("Access Denied: User is not verified."); } // Proceed securely grantAccess();} catch (e) { console.error("IAM Verification failed:", e);}Gate access on Trust Score
Drop-in React component. Renders children only if the connected wallet meets your Trust Score threshold. Source and live preview at /gate-demo.
import { IAMGate } from "@/components/ui/iam-gate";export function PremiumPage() { return ( <IAMGate minTrustScore={100}> {/* Children render only when the connected wallet has an IAM Anchor with trust score >= 100 */} <h1>Welcome, verified human.</h1> </IAMGate> );}Display verification status
Use the drop-in React component to show identity status.
import { IAMBadge } from "@/components/ui/iam-badge";import { useConnection } from "@solana/wallet-adapter-react";export function ProfileHeader({ walletAddress }) { const { connection } = useConnection(); return ( <div className="flex items-center gap-4"> <h2 className="text-xl font-bold">{walletAddress}</h2> {/* Renders a verified pill with the trust score */} <IAMBadge walletAddress={walletAddress} connection={connection} /> </div> );}Self-contained React components.
Copy the source, paste into your Tailwind project, render anywhere. No custom UI dependencies, no IAM backend. Each component reads directly from Solana via your existing wallet connection.
<IAMBadge />
Pill that displays any wallet's Trust Score. Use in profiles, comments, leaderboards, anywhere humanness matters.
<IAMGate minTrustScore={N}>
Route guard. Wrap any content, set a threshold, the gate handles wallet connection, identity lookup, and verification prompts.
| Option | Type | Description |
|---|---|---|
| cluster | "devnet" | "mainnet-beta" | Solana cluster to connect to |
| rpcEndpoint | string | Custom RPC URL (optional) |
| relayerUrl | string | IAM relayer endpoint (walletless mode only) |
| relayerApiKey | string | API key for walletless mode (optional) |
| wasmUrl | string | Path to iam_hamming.wasm circuit artifact |
| zkeyUrl | string | Path to iam_hamming_final.zkey proving key |
| threshold | number | Hamming distance threshold (default: 96) |
Zero integration cost
Wallet-connected users pay a small protocol fee per verification (~0.005 SOL). Your application reads on-chain state for free via verifyIAMAttestation(). No escrow, no API keys, no billing relationship. You get verified humans. The user pays to prove they're human.
Built-in bot resistance.
Every verification costs the user SOL. Synthetic data is rejected server-side before reaching the chain. Bot farms must fund thousands of wallets, pay per verification, and maintain Trust Score across months. You control trust requirements through four mechanisms.
Rate limiting
Cap verifications per IP, per session, or per time window. The relayer enforces limits before a transaction reaches the chain.
Trust Score thresholds
Require a minimum Trust Score to access protected features. New identities start at zero. High-value actions (airdrops, governance) can require weeks of consistent verification history.
Protocol fee defense
Every verification costs the user SOL. Bot farms must fund wallets and pay per attempt. The cost scales with the attack.
Graduated trust tiers
First walletless verification is a liveness check. Returning verifications build device-bound consistency. Wallet-connected mode builds portable, on-chain Trust Score. Match the tier to the sensitivity of the action.