Developer Documentation
Integrate VerifyBlind into your own platform in minutes.
Quickstart
VerifyBlind integration takes three steps: create an account, write a backend nonce endpoint, and embed the widget. The server-side webhook is optional — it works fully with the frontend widget alone.
1
Partner Account & API Key
Partner Portal — sign up and copy your API Key from the Settings page. The API Key is a UUID. Never embed it in the frontend.
2
Backend Nonce Endpoint
The widget sends a temporary RSA public key it generated in the browser to an endpoint on your backend. That endpoint forwards the data to the VerifyBlind API and returns a nonce. The API key stays on the server side.
// POST /generate-nonce (Express)
app.post('/generate-nonce', async (req, res) => {
const { public_key, validations, additional_data } = req.body;
const response = await fetch('https://api.verifyblind.com/api/pop/generate', {
method: 'POST',
headers: { 'Content-Type': 'application/json', 'X-API-Key': process.env.VERIFYBLIND_API_KEY },
body: JSON.stringify({ public_key, validations, additional_data }),
});
res.json(await response.json()); // { "nonce": "b1362715-..." }
});3
Widget Embed
Add verifyblind.js to your page.
HTML
<script src="https://partner.verifyblind.com/verifyblind.js"></script>
<div id="verifyblind-container"></div>
<script>
window.VerifyBlind.init({
generateUrl: '/generate-nonce',
apiUrl: 'https://api.verifyblind.com',
captcha: true,
payload: {
validations: { age: '18+', user_id: true },
additional_data: { session_id: 'abc123' },
},
containerId: 'verifyblind-container',
onSuccess: (data) => {
console.log(data.validations.age); // true / false
console.log(data.validations.user_id); // "a1b2c3..." anonymous ID
},
onError: (err) => console.error(err),
});
</script>Flow Summary
Browser (verifyblind.js) Partner Backend VerifyBlind API
──────────────────────────────────────────────────────────────────
1. Generate a temporary RSA key pair
2. public_key + validations ──► POST /generate-nonce ──► POST /api/pop/generate
◄── { nonce } ◄── { nonce }
3. Show QR (nonce embedded)
4. User scans QR and verifies on their phone
5. GET /api/pop/result/{nonce} (polling) ─────────────────────────►
6. { status: "completed", encrypted_response: {...} } ◄───────────
7. Decrypt in the browser with the temporary private key
8. onSuccess(data) ✓