Drop a single <script> tag on your site to launch a fully-compliant Remote Online Notarization ceremony — KBA, live A/V witness, biometric signature, and on-chain Hedera seal.
From zero to your first sealed document in under five minutes.
Head to Manage Keys and create a new key (test or live). Lock it to your domains with the allowed-origins list.
<!-- NotaryChain SDK · drop anywhere on your site -->
<script src="https://acn-oracle-live.emergent.host/api/sdk/v1/notarychain.js"></script>
<script>
NotaryChain.init({ publishableKey: 'pk_live_YOUR_KEY' });
document.getElementById('notarize-btn').addEventListener('click', () => {
NotaryChain.startCeremony({
documentName: 'Power of Attorney',
documentType: 'power_of_attorney',
signerEmail: 'jane@example.com',
signerName: 'Jane Doe',
metadata: { order_id: '12345' }
});
});
NotaryChain.on('sealed', (data) => {
console.log('Sealed:', data.seal_hash, data.hcs_tx);
});
</script>
<button id="notarize-btn">Notarize this document</button>import { useEffect } from 'react';
export function NotarizeButton({ document }) {
useEffect(() => {
if (!document.querySelector('script[data-nc-sdk]')) {
const s = document.createElement('script');
s.src = 'https://acn-oracle-live.emergent.host/api/sdk/v1/notarychain.js';
s.setAttribute('data-nc-sdk', '1');
document.head.appendChild(s);
s.onload = () => window.NotaryChain.init({
publishableKey: process.env.REACT_APP_NC_KEY
});
}
}, []);
const start = () => {
window.NotaryChain.startCeremony({
documentName: document.name,
documentType: 'contract',
signerEmail: document.signer.email,
metadata: { doc_id: document.id }
});
window.NotaryChain.on('sealed', (d) => onComplete(d));
};
return <button onClick={start}>Notarize</button>;
}// Express.js example — verify NotaryChain webhook signature
import crypto from 'crypto';
app.post('/webhooks/notarychain', express.raw({ type: 'application/json' }), (req, res) => {
const signature = req.headers['x-notarychain-signature'];
const secret = process.env.NC_WEBHOOK_SECRET;
const expected = 'sha256=' + crypto
.createHmac('sha256', secret)
.update(JSON.stringify(JSON.parse(req.body), Object.keys(JSON.parse(req.body)).sort()))
.digest('hex');
if (signature !== expected) return res.status(401).send('Invalid signature');
const event = JSON.parse(req.body);
switch (event.type) {
case 'ceremony.sealed':
console.log('Sealed:', event.data.seal_hash, event.data.hcs_tx);
// Update your DB: mark document as notarized
break;
case 'ceremony.completed':
console.log('Completed:', event.data.session_token);
break;
}
res.json({ received: true });
});All client-side events the SDK emits via NotaryChain.on(event, callback).
| Event | Fires when | Payload |
|---|---|---|
| ready | Iframe loaded and session created | { sessionToken, mode } |
| signed | Signer applied their signature | { token } |
| completed | Ceremony pipeline finished | { seal_hash } |
| sealed | Hedera HCS anchor confirmed | { seal_hash, hcs_tx } |
| error | Any unrecoverable error | { error } |
| close | Modal closed (manual or auto) | {} |
Single script tag + init call. No iframes to manage, no CORS headaches.
Server-to-server confirmation with SHA-256 signatures and replay protection.
KBA, A/V capture, Hedera anchor, and FL §117.245 journal logging — all included.
SDK access is included with every Professional ($99/mo) and Enterprise ($199/mo) plan.
Made with Emergent