Self-sovereign identity on the blockchain. Passwordless login, crypto payments, recoverable keys, and on-chain data — all with simple API calls.
These endpoints generate deep links using the new GenericRequest framework. They'll work once Verus Mobile merges the generic-request-changes branch. The deep links are generated live — the wallet just can't process them yet.
Every VerusID has built-in security features that don't exist in normal crypto wallets. Look up any identity to see its security status.
flags & 2 bit on-chain. When locked, no transactions can be sent from this identity — not even by the private key holder. Only the revocation authority can unlock it, and only after a timelock period (if set). Think of it as a vault door with a time delay.# Lock an identity ./verus updateidentity '{"name":"veruscx","flags":2}' # Unlock (starts timelock countdown) ./verus updateidentity '{"name":"veruscx","flags":0}'
No passwords. Users sign a cryptographic challenge with their VerusID. Verified against the blockchain — no credential database to leak.
No OAuth. No third-party provider. Your server talks directly to the blockchain.
Cross-platform. QR code (desktop), deep link (mobile), or browser extension. Auto-detected.
We built verus-connect — a drop-in package that handles login, payments, QR codes, deep links, and extension support.
npm install github:Fried333/verus-connect npm install git+https://github.com/VerusCoin/verusid-ts-client.git
SIGNING_IADDRESS=iYourVerusIDAddress PRIVATE_KEY=UxYourWIFPrivateKey CALLBACK_URL=https://yoursite.com/verusidlogin
npx verus-connect start
const { verusAuth } = require('verus-connect/server'); app.use('/verus', verusAuth({ iAddress: process.env.SIGNING_IADDRESS, privateKey: process.env.PRIVATE_KEY, callbackUrl: process.env.CALLBACK_URL, }));
<button id="login">Login with VerusID</button> <canvas id="qr"></canvas> <script src="https://cdn.jsdelivr.net/npm/qrcode/build/qrcode.min.js"></script> <script> document.getElementById('login').onclick = async () => { const { challengeId, deepLink } = await fetch('/verus/login', { method: 'POST' }).then(r => r.json()); await QRCode.toCanvas(document.getElementById('qr'), deepLink, { width: 250 }); const poll = setInterval(async () => { const d = await fetch(`/verus/result/${challengeId}`).then(r => r.json()); if (d.status === 'verified') { clearInterval(poll); alert(`Welcome, ${d.friendlyName}!`); } }, 3000); }; </script>
// Supports VerusID names, i-addresses, and R-addresses const { deep_link } = await fetch('/verus/pay-deeplink', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ address: 'veruscx@', amount: 5 }) }).then(r => r.json());
// Request user to update their content multimap const { deep_link } = await fetch('/verus/identity-update-request', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ identity: 'veruscx@', updates: { contentMultiMap: { 'vdxfKeyId': { msg: 'hello' } } } }) }).then(r => r.json());
verus-typescript-primitives — Core types: LoginConsentRequest, VerusPayInvoice, TransferDestination, VDXF keys.
verusid-ts-client — VerusID interface for signing, verifying, and RPC interaction.
| Login Consent Request | Active |
| VerusPay Invoice | Active |
| Identity Update Request | Code exists, disabled |
| Web Wallet Extension | Active (window.verus) |
POST /login | Create login challenge |
GET /result/:id | Poll for result |
POST /pay-deeplink | Generate payment QR — accepts name@, i-address, or R-address |
POST /identity-update-request | Create identity update request deep link (v3) |
GET /health | Health check + genericRequestSupported flag |
getidentity | Identity by name or i-address |
getcurrency | Currency definition |
getaddressbalance | Address balance |
listcurrencies | All currencies |