Developer Docs

Add privacy-preserving ZK verification to any app. Client-side Groth16 proofs — secrets never leave the device.

Choose Your Integration

Three ways to add ZK verification. All proofs are generated client-side — secrets never leave the user's device.

SDK (npm)

Full control. Import into any JS/TS project.

npm install zkrune-sdk snarkjs

import { generateProof, verifyProofRemote }
  from 'zkrune-sdk';

const result = await generateProof({
  templateId: 'age-verification',
  inputs: { birthYear: '1990',
    currentYear: '2026', minimumAge: '18' },
});

const { isValid } = await verifyProofRemote({
  circuitName: 'age-verification',
  proof: result.proof.groth16Proof,
  publicSignals: result.proof.publicSignals,
});

Widget (script tag)

Drop-in. No bundler needed.

<script src="https://cdn.jsdelivr.net/
  npm/zkrune-widget@latest/dist/
  zkrune-widget.global.js"></script>

<div id="zk"></div>
<script>
  ZkRuneWidget.init({
    container: '#zk',
    theme: 'dark',
    onResult: (r) => console.log(r.verified)
  });
</script>

Verify API

Server-side verification against trusted keys.

POST https://zkrune.com/api/verify-proof

{
  "circuitName": "age-verification",
  "proof": { "pi_a": [...], ... },
  "publicSignals": ["1"]
}

// Response:
// { "isValid": true, "timing": 2 }

Which One Should I Use?

CriteriaSDKWidgetVerify API
Bundler requiredYesNoNo
Proof generationClientClientN/A (verify only)
UI includedNoYesNo
CustomizationFullTheme + configFull
Best fordApps, custom UIBlogs, landing pagesBackend verification
Privacy Infrastructure on Solana