isHuman Network

Proof-of-humanity credentials with local verification and site-private identity boundaries.

/

What is isHuman?

isHuman is Lemma's proof-of-humanity network for websites and applications. A user verifies once through Stripe Identity, then receives an Ed25519-signed credential that can be reused across sites while preserving privacy via per-site PPIDs.

Core model

Master credential is issued for lemma.id. On third-party sites, the wallet bridge derives a site-specific credential on first request and stores it for later use.

Verification Flow

StepComponentWhat happens
1User + Stripe IdentityUser completes identity verification flow initiated from /api/ishuman/start-verification.
2Stripe webhook/api/webhooks/stripe-identity receives identity.verification_session.verified and records verification state.
3Credential issuanceLemma issues a signed isHuman credential (isHuman: true) with issuer metadata and TTL.
4Wallet bridgeClient requests credential through /wallet/bridge. If needed, bridge calls /api/ishuman/derive-site-proof.
5Site verifier SDKIsHumanVerifier validates claim, expiry, revocation membership, and Ed25519 signature locally in browser.

SDK Integration

Basic integration uses the hosted SDK and calls verify() when you need a verdict.

HTML
<script src="https://lemma.id/sdk/ishuman-verifier.js"></script> <script> const verifier = new IsHumanVerifier({ siteId: 'your-site-id' }); const result = await verifier.verify(); // result: { human, ppid, reason, timeMs, error } </script>

Constructor options

OptionTypeDefaultNotes
siteIdstringwindow.location.hostnameRegistered site identifier used for bridge requests.
lemmaOriginstringhttps://lemma.idOverride for non-production testing environments.
debugbooleanfalseEnables SDK console logging.
isBlockedLocallyfunctionnullOptional local callback for site-level PPID block checks.

verify() result

verify() returns { human: boolean, ppid: string | null, reason: string, timeMs: number, error: string | null }.

Common reasons include valid, no_credential, expired, revoked, invalid_signature, and site_blocked.

isHuman API Reference

MethodPathPurposeAuth
POST/api/ishuman/start-verificationCreate Stripe Identity verification session.None
GET/api/ishuman/verification-status/<session_id>Poll verification status and fetch credential payload when ready.None
POST/api/ishuman/site-blockApply immediate site-level PPID block.X-API-Key
POST/api/ishuman/site-unblockRemove site-scoped block.X-API-Key
POST/api/ishuman/network-revokeSubmit network-wide revocation request (pending review).X-API-Key
POST/api/ishuman/approve-revocationAdmin approval path for network revocation.Admin credential
GET/api/ishuman/checkCheck site block and network revocation status for a PPID.None
GET/api/ishuman/site-blocksList all active blocks for the authenticated site.X-API-Key
GET/api/ishuman/statsPublic network statistics.None
POST/api/ishuman/derive-site-proofDerive or fetch cached site-specific credential from master proof.None

Revocation and Abuse Controls

Tier 1: Site block (immediate)

Each site can block a PPID instantly on its own domain using /api/ishuman/site-block.

Tier 2: Network revocation (reviewed)

Sites can request network action via /api/ishuman/network-revoke. Admin approval through /api/ishuman/approve-revocation revokes wallet, master credential, and derived credentials.

Privacy Model (PPID by Site)

  • PPID derivation binds identity to wallet secret + normalized site hostname.
  • Derived credentials are site-specific; one site's PPID cannot be correlated directly by another site.
  • Wallet bridge and derivation paths preserve separation between internal site IDs and runtime hostname binding.