Our REST endpoints are shape-compatible with OxaPay's to within a few field names. Typical migration of the invoice + webhook surface takes under 30 minutes. Here's the concrete mapping.
POST api.oxapay.com/merchants/requestRENAMEPOST orbchain.io/v1/payment/invoiceORBPOST api.oxapay.com/merchants/request/staticaddressRENAMEPOST orbchain.io/v1/payment/static-addressORBPOST orbchain.io/v1/payment/white-labelORBPOST api.oxapay.com/merchants/payoutRENAMEPOST orbchain.io/v1/payoutORBGET api.oxapay.com/merchants/inquiry?trackId=XRESHAPEGET orbchain.io/v1/payment/:track_idORBamountamountSAMEcurrency (fiat OR coin)currency (fiat only) + accepted_coins (list) OR pay_currency (single)SPLITorderIdorder_idSNAKEemailcustomer_emailRENAMEcallbackUrlcallback_urlSNAKEreturnUrlreturn_urlSNAKEdescriptiondescriptionSAMElifeTime (minutes)expires_in (seconds)UNIT ×60payCurrency (settlement hint)settlement_coin (merchant setting)MOVE// OxaPay — before curl https://api.oxapay.com/merchants/request \ -H "Content-Type: application/json" \ -d '{ "merchant": "sandbox", "amount": 50, "currency": "USD", "orderId": "order_7f92a1", "callbackUrl": "https://shop.example/webhooks/oxa", "lifeTime": 60 }' // OrbChain — after curl https://orbchain.io/v1/payment/invoice \ -H "merchant_api_key: mk_live_…" \ -H "Content-Type: application/json" \ -d '{ "amount": 50, "currency": "USD", "accepted_coins": ["BTC_LN", "USDT_TRC20"], "order_id": "order_7f92a1", "callback_url": "https://shop.example/webhooks/orb", "expires_in": 3600 }'
// OxaPay — HMAC-SHA256 over JSON body, header `HMAC` const crypto = require("crypto"); function verifyOxa(body, header, secret) { const expected = crypto.createHmac("sha256", secret) .update(body).digest("hex"); return crypto.timingSafeEqual( Buffer.from(expected, "hex"), Buffer.from(header, "hex") ); } // OrbChain — HMAC-SHA512 over JSON body, header `HMAC` function verifyOrb(body, header, secret) { const expected = crypto.createHmac("sha512", secret) // only diff .update(body).digest("hex"); return crypto.timingSafeEqual( Buffer.from(expected, "hex"), Buffer.from(header, "hex") ); } // Bonus: dedupe with OrbChain's deterministic event_id if (seenEventIds.has(payload.event_id)) return res.sendStatus(200);
merchant_api_key and set a webhook_secret.~5minaccepted_coins.~8min"sha256" to "sha512" in your webhook verifier.~2minlifeTime value by 60 — OrbChain uses seconds, OxaPay uses minutes.~1minKeep OxaPay open for reconciliation; flip new invoices to OrbChain with a feature flag.