Every paid invoice emits an Ed25519-signed JSON receipt. Verify offline against our published public key — in any language, in any runtime, without talking to our API. The record of settlement is cryptographic, not just a row in our database.
payment.paid webhook fires.PAIDsrc/services/receipts.ts).CANONICALcrypto.sign(null, canonical, privateKey) — Ed25519 over the canonical bytes. 64-byte signature.SIGNEDGET /v1/payment/:track_id/receipt returns the body + signature + public-key fingerprint.AVAILABLE/v1/common/receipt-public-key (cache forever). Verify signature offline in any language.OFFLINE// Fetch the receipt + verify against our public key (cached once). const crypto = require("crypto"); function verifyReceipt(receipt, publicKeyPem) { const canonical = JSON.stringify(receipt.body, Object.keys(receipt.body).sort()); return crypto.verify( null, // Ed25519 takes no hash algo Buffer.from(canonical), crypto.createPublicKey(publicKeyPem), Buffer.from(receipt.signature, "hex") ); } // One-time fetch + pin. Public key rarely rotates. const publicKeyPem = await fetch( "https://orbchain.io/v1/common/receipt-public-key" ).then(r => r.text()); // Fetch the receipt (one-time, with auth). const receipt = await fetch( "https://orbchain.io/v1/payment/pay_01JR3K9T…/receipt", { headers: { "merchant_api_key": "mk_live_…" } } ).then(r => r.json()); // Verify anywhere, anytime — no network required after pin. verifyReceipt(receipt, publicKeyPem); // → true
Yes. Ed25519 (RFC 8032). Canonical JSON with sorted keys. Public key in PKCS#8 PEM. No custom crypto, no bespoke serialization.
The endpoint returns both the current key and a list of previous keys with their validity windows. A receipt signed with a prior key still verifies — we never invalidate old signatures.
Yes. Pin the public key once at signup; verify every subsequent receipt offline. No network calls needed. This is the whole point.
track_id, version, merchant_id, coin, pay_currency, amount, amount_usd, fee_usd, net_usd, tx_hash, confirmations, confirmed_at, receipt_issued_at. Nothing that requires looking us up.
Yes — GET /v1/payout/:payout_id/receipt. Same signature scheme. Same verification code.
No other crypto gateway ships this. Adds zero work on your side until you need the evidence.