Integrate

Add IAM verification to your app in 5 lines of code.

// QUICK START

Install

npm install @iam-protocol/pulse-sdk

Walletless 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 site
const 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 wallet
const result = await pulse.verify(
touchElement, wallet.adapter, connection
);
if (result.success) {
// result.txSignature — Solana transaction signature
grantAccess(result.commitment);
}
// TRY IT LIVE

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)

// USE CASES

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 route
const { 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>
);
}
// DROP-IN COMPONENTS

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.

Live demo + source

<IAMGate minTrustScore={N}>

Route guard. Wrap any content, set a threshold, the gate handles wallet connection, identity lookup, and verification prompts.

Live demo + source
// CONFIGURATION
OptionTypeDescription
cluster"devnet" | "mainnet-beta"Solana cluster to connect to
rpcEndpointstringCustom RPC URL (optional)
relayerUrlstringIAM relayer endpoint (walletless mode only)
relayerApiKeystringAPI key for walletless mode (optional)
wasmUrlstringPath to iam_hamming.wasm circuit artifact
zkeyUrlstringPath to iam_hamming_final.zkey proving key
thresholdnumberHamming distance threshold (default: 96)
// PRICING

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.

// ABUSE PREVENTION

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.