{"_id":"@airxpay/init-sdk","_rev":"11-3612d25c6f985c97269198ce8627fbf5","name":"@airxpay/init-sdk","dist-tags":{"latest":"1.0.9"},"versions":{"1.0.0":{"name":"@airxpay/init-sdk","version":"1.0.0","keywords":["airxpay","flixora","sdk","seller","onboard"],"author":{"name":"Tafseel Khan"},"license":"MIT","_id":"@airxpay/init-sdk@1.0.0","maintainers":[{"name":"tafseel1983","email":"tafseel1983@gmail.com"}],"homepage":"https://github.com/tafseelkhan/airxpay-sdk#readme","bugs":{"url":"https://github.com/tafseelkhan/airxpay-sdk/issues"},"dist":{"shasum":"18f4880b05d0ea15298670e96f870006a348a0a5","tarball":"https://registry.npmjs.org/@airxpay/init-sdk/-/init-sdk-1.0.0.tgz","fileCount":10,"integrity":"sha512-UBv+VCVp1rgVEykiiK9z2fhmqb0vqXk7HrbFpNQ08aYZREZHVpJ57ftpj8PnluDQWYrT9CvD2A2j2B7ZGVQinQ==","signatures":[{"sig":"MEQCICUeAnN69+tQJMnA0K5wp0v9n83Nv+MlJzU6phmCYgh+AiAWo7HtH0JaOvaj7ikHv90cNJpyeC+T5OCf+vrXiZtcUw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12614},"main":"dist/index.js","gitHead":"47fa430e205eaa4f7a7a8b7246418185a35d1981","scripts":{"build":"tsc --project tsconfig.json --outDir dist --declaration false","prepare":"npm run build"},"_npmUser":{"name":"tafseel1983","email":"tafseel1983@gmail.com"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/tafseelkhan/airxpay-sdk.git","type":"git"},"_npmVersion":"9.9.4","description":"AirXPay Flixora SDK - Seller Onboard","directories":{},"_nodeVersion":"20.19.5","dependencies":{"axios":"^1.13.5"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/init-sdk_1.0.0_1771133273411_0.05827108777415435","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@airxpay/init-sdk","version":"1.0.1","keywords":["airxpay","flixora","sdk","seller","onboard"],"author":{"name":"Tafseel Khan"},"license":"MIT","_id":"@airxpay/init-sdk@1.0.1","maintainers":[{"name":"tafseel1983","email":"tafseel1983@gmail.com"}],"homepage":"https://github.com/tafseelkhan/airxpay-sdk#readme","bugs":{"url":"https://github.com/tafseelkhan/airxpay-sdk/issues"},"dist":{"shasum":"a99eee227000ee3a757774287ab52f47b51aec83","tarball":"https://registry.npmjs.org/@airxpay/init-sdk/-/init-sdk-1.0.1.tgz","fileCount":10,"integrity":"sha512-u96HBXabV78K6OoAuk7jyd+z7msYyu1zJljDPNj2f0pusaHVlJy7jGz+oq8ZYCSaYlCsBgWqkYlXScQXz9EToQ==","signatures":[{"sig":"MEUCIFHNjpmsPZK/nKqSrgmKtpcxph0bq0BOcuT5IGpbryyRAiEAttr03nyGQ9Fkw+m45RMqqkKm8wc/208FMo593WAydlk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12627},"main":"dist/index.js","gitHead":"eee0cc1903845816abff6e10011dbfd0925a6d95","scripts":{"build":"tsc --project tsconfig.json --outDir dist --declaration false","prepare":"npm run build"},"_npmUser":{"name":"tafseel1983","email":"tafseel1983@gmail.com"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/tafseelkhan/airxpay-sdk.git","type":"git"},"_npmVersion":"9.9.4","description":"AirXPay Flixora SDK - Seller Onboard","directories":{},"_nodeVersion":"20.19.5","dependencies":{"axios":"^1.13.5"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/init-sdk_1.0.1_1771137407627_0.9168573021126838","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@airxpay/init-sdk","version":"1.0.2","keywords":["airxpay","flixora","sdk","seller","onboard"],"author":{"name":"Tafseel Khan"},"license":"MIT","_id":"@airxpay/init-sdk@1.0.2","maintainers":[{"name":"tafseel1983","email":"tafseel1983@gmail.com"}],"homepage":"https://github.com/tafseelkhan/airxpay-sdk#readme","bugs":{"url":"https://github.com/tafseelkhan/airxpay-sdk/issues"},"dist":{"shasum":"0dc61db1bea784afdcb4f63b16b546359fbb4147","tarball":"https://registry.npmjs.org/@airxpay/init-sdk/-/init-sdk-1.0.2.tgz","fileCount":24,"integrity":"sha512-CVGeoqIhcC/pTOtCGPOaDoYojQQ2ezw0nA5NNPxGGssnNbBTuRf/wt4D9NFL/yWu1KldhhNPrL2kM0gWUIEDIA==","signatures":[{"sig":"MEUCIE/8NXKrRkT8e8TNBMUF8c8uFINBHAoRFbfwtGAJ+glcAiEAsxx50Eixftjpo11IYj0k6OQ7swo2dioQMxGy7VwLFlI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":18161},"main":"dist/index.js","types":"dist/types/index.d.ts","gitHead":"598e811cb4b38cbc3ad0a9bff2b4aabcde395c62","scripts":{"build":"tsc --project tsconfig.json --outDir dist && cpx \"src/types/**/*\" dist/types","prepare":"npm run build"},"_npmUser":{"name":"tafseel1983","email":"tafseel1983@gmail.com"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/tafseelkhan/airxpay-sdk.git","type":"git"},"_npmVersion":"9.9.4","description":"AirXPay Flixora SDK - Seller Onboard","directories":{},"_nodeVersion":"20.19.5","dependencies":{"axios":"^1.13.5"},"_hasShrinkwrap":false,"devDependencies":{"cpx":"^1.5.0","typescript":"^5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/init-sdk_1.0.2_1771139161061_0.17564423397855355","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@airxpay/init-sdk","version":"1.0.3","keywords":["airxpay","flixora","sdk","seller","onboard"],"author":{"name":"Tafseel Khan"},"license":"MIT","_id":"@airxpay/init-sdk@1.0.3","maintainers":[{"name":"tafseel1983","email":"tafseel1983@gmail.com"}],"homepage":"https://github.com/tafseelkhan/airxpay-sdk#readme","bugs":{"url":"https://github.com/tafseelkhan/airxpay-sdk/issues"},"dist":{"shasum":"f18c87720e948827215009013193c662fb10387c","tarball":"https://registry.npmjs.org/@airxpay/init-sdk/-/init-sdk-1.0.3.tgz","fileCount":24,"integrity":"sha512-OxXg0pU2/GDOAuBPIpuld3r3KdlzpUUqm9OJZUZDBf93Wo2UvZ3qnQXp05qlG+YQ9WsxIe6TPeeFb64f0I/llA==","signatures":[{"sig":"MEUCIQCKvQA/hfIMaLcPtCYPCgFuxFu6t0uehPFR29fUCgB1jwIgPGyRPAbDkMefY0g+tBUNXNXKDqUF3e0jZnr8RxxpSwg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":18181},"main":"dist/index.js","types":"dist/types/index.d.ts","gitHead":"2a551faea15e09c9f15d4cf87e9b88f9be41bf49","scripts":{"build":"tsc --project tsconfig.json --outDir dist && cpx \"src/types/**/*\" dist/types","prepare":"npm run build"},"_npmUser":{"name":"tafseel1983","email":"tafseel1983@gmail.com"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/tafseelkhan/airxpay-sdk.git","type":"git"},"_npmVersion":"9.9.4","description":"AirXPay Flixora SDK - Seller Onboard","directories":{},"_nodeVersion":"20.19.5","dependencies":{"axios":"^1.13.5"},"_hasShrinkwrap":false,"devDependencies":{"cpx":"^1.5.0","typescript":"^5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/init-sdk_1.0.3_1771142044985_0.010854462768723039","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"@airxpay/init-sdk","version":"1.0.5","keywords":["airxpay","flixora","sdk","seller","onboard"],"author":{"name":"Tafseel Khan"},"license":"MIT","_id":"@airxpay/init-sdk@1.0.5","maintainers":[{"name":"tafseel1983","email":"tafseel1983@gmail.com"}],"homepage":"https://github.com/tafseelkhan/airxpay-sdk#readme","bugs":{"url":"https://github.com/tafseelkhan/airxpay-sdk/issues"},"dist":{"shasum":"2ac5d6fe59e933265fe6ef924768028fe8026d8e","tarball":"https://registry.npmjs.org/@airxpay/init-sdk/-/init-sdk-1.0.5.tgz","fileCount":24,"integrity":"sha512-ZZ4CzoJW9HLEsikWpoBNSizcTMeVmwUy1lZkCnorBbB9N+bQrMI7DkwFH8yUiZU1fyuUhTDDBBijQkuChvWS0w==","signatures":[{"sig":"MEUCIHvugXT2K114tnXUVBnRNyk3QnJWNJ9kNkXhuv+KeFDwAiEA1Hnk05exjM1CvsK50angnkGof5VDvNNmLr+SFs+Qiho=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":17990},"main":"dist/index.js","types":"dist/types/index.d.ts","gitHead":"2a551faea15e09c9f15d4cf87e9b88f9be41bf49","scripts":{"build":"tsc --project tsconfig.json --outDir dist && cpx \"src/types/**/*\" dist/types","prepare":"npm run build"},"_npmUser":{"name":"tafseel1983","email":"tafseel1983@gmail.com"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/tafseelkhan/airxpay-sdk.git","type":"git"},"_npmVersion":"9.9.4","description":"AirXPay Flixora SDK - Seller Onboard","directories":{},"_nodeVersion":"20.19.5","dependencies":{"axios":"^1.13.5"},"_hasShrinkwrap":false,"devDependencies":{"cpx":"^1.5.0","typescript":"^5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/init-sdk_1.0.5_1771143016066_0.4276558723476793","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@airxpay/init-sdk","version":"1.0.4","keywords":["airxpay","flixora","sdk","seller","onboard"],"author":{"name":"Tafseel Khan"},"license":"MIT","_id":"@airxpay/init-sdk@1.0.4","maintainers":[{"name":"tafseel1983","email":"tafseel1983@gmail.com"}],"homepage":"https://github.com/tafseelkhan/airxpay-sdk#readme","bugs":{"url":"https://github.com/tafseelkhan/airxpay-sdk/issues"},"dist":{"shasum":"015706dd8c573ec31eb0ce2c5e7c769d8aa82517","tarball":"https://registry.npmjs.org/@airxpay/init-sdk/-/init-sdk-1.0.4.tgz","fileCount":34,"integrity":"sha512-IP9KNqvOMKwFprdVlTDHLjaE75v/6JHnjKk5tz4+ttaAHqVXQe6i2gJh8Ld9iyfC0XOrFK1PMR8n0P9OqUFsEA==","signatures":[{"sig":"MEUCIGroC4c2DY4N1nOgUT8gjCA4EjECN7jhBCcvs3N5GezvAiEArdruk5BOD9wKt7XlpBI3BBUlv+lUqNCU1c7nhDvZEYM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":21593},"main":"dist/index.js","types":"dist/types/index.d.ts","gitHead":"2a551faea15e09c9f15d4cf87e9b88f9be41bf49","scripts":{"build":"tsc --project tsconfig.json --outDir dist && cpx \"src/types/**/*\" dist/types","prepare":"npm run build"},"_npmUser":{"name":"tafseel1983","email":"tafseel1983@gmail.com"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/tafseelkhan/airxpay-sdk.git","type":"git"},"_npmVersion":"9.9.4","description":"AirXPay Flixora SDK - Seller Onboard","directories":{},"_nodeVersion":"20.19.5","dependencies":{"axios":"^1.13.5"},"_hasShrinkwrap":false,"devDependencies":{"cpx":"^1.5.0","typescript":"^5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/init-sdk_1.0.4_1771143282628_0.9994437216087428","host":"s3://npm-registry-packages-npm-production"}},"1.0.6":{"name":"@airxpay/init-sdk","version":"1.0.6","keywords":["airxpay","flixora","sdk","seller","onboard"],"author":{"name":"Tafseel Khan"},"license":"MIT","_id":"@airxpay/init-sdk@1.0.6","maintainers":[{"name":"tafseel1983","email":"tafseel1983@gmail.com"}],"homepage":"https://github.com/tafseelkhan/airxpay-sdk#readme","bugs":{"url":"https://github.com/tafseelkhan/airxpay-sdk/issues"},"dist":{"shasum":"61a08b3f3fb2cf06165408cd963cb21382b001d0","tarball":"https://registry.npmjs.org/@airxpay/init-sdk/-/init-sdk-1.0.6.tgz","fileCount":34,"integrity":"sha512-BE0DsWMLNAk/QAbTx/YQU2n5tRXeHd2NKowPU26ZvcgQzNxL5qTVGCXAWcRIY5RlgBo4YneCDsyGqg2WnFPnDg==","signatures":[{"sig":"MEUCIQCwGi+IiQHuCjbUhc1QriusWxYPUOKfGxmzZiT7LXgZxgIgdpiaQlwdsE1APisFX0q69vG1SRzs74/a6GPHcoBAzAA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":21587},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"2a551faea15e09c9f15d4cf87e9b88f9be41bf49","scripts":{"build":"tsc --project tsconfig.json --outDir dist && cpx \"src/types/**/*\" dist/types","prepare":"npm run build"},"_npmUser":{"name":"tafseel1983","email":"tafseel1983@gmail.com"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/tafseelkhan/airxpay-sdk.git","type":"git"},"_npmVersion":"9.9.4","description":"AirXPay Flixora SDK - Seller Onboard","directories":{},"_nodeVersion":"20.19.5","dependencies":{"axios":"^1.13.5"},"_hasShrinkwrap":false,"devDependencies":{"cpx":"^1.5.0","typescript":"^5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/init-sdk_1.0.6_1771143624242_0.08550931326989097","host":"s3://npm-registry-packages-npm-production"}},"1.0.8":{"name":"@airxpay/init-sdk","version":"1.0.8","keywords":["airxpay","flixora","sdk","seller","onboard"],"author":{"name":"Tafseel Khan"},"license":"MIT","_id":"@airxpay/init-sdk@1.0.8","maintainers":[{"name":"tafseel1983","email":"tafseel1983@gmail.com"}],"homepage":"https://github.com/tafseelkhan/airxpay-sdk#readme","bugs":{"url":"https://github.com/tafseelkhan/airxpay-sdk/issues"},"dist":{"shasum":"ad6395ff0888cb10cc5dce7ce32998b351702132","tarball":"https://registry.npmjs.org/@airxpay/init-sdk/-/init-sdk-1.0.8.tgz","fileCount":25,"integrity":"sha512-j0I9tH+HGH+B3jQvntZYCPrV92sZ1uL7pnZ9D/YkXpX54Cdz91V7vZiCOpnYfrhAy+Q/riBNukbtadyyqfTdeg==","signatures":[{"sig":"MEUCIQCtoZUmrgaSk5+fAuhpgHpOJFByf7lVrNIocFgCLupWAwIgd0jZ5xohYzHWpnYLV4TQPjRkvBNQwFwld6xvwZzS7kU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":48100},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"d56b8ca619dad8b336fb89a98721cf1f0ab9c15c","scripts":{"build":"tsc --project tsconfig.json --outDir dist && cpx \"src/types/**/*\" dist/types","prepare":"npm run build"},"_npmUser":{"name":"tafseel1983","email":"tafseel1983@gmail.com"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/tafseelkhan/airxpay-sdk.git","type":"git"},"_npmVersion":"9.9.4","description":"AirXPay Flixora SDK - Seller Onboard","directories":{},"_nodeVersion":"20.19.5","dependencies":{"axios":"^1.13.5"},"_hasShrinkwrap":false,"devDependencies":{"cpx":"^1.5.0","typescript":"^5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/init-sdk_1.0.8_1771161858910_0.0005436385844066471","host":"s3://npm-registry-packages-npm-production"}},"1.0.9":{"name":"@airxpay/init-sdk","version":"1.0.9","keywords":["airxpay","flixora","sdk","merchant","onboard"],"author":{"name":"Tafseel Khan"},"license":"MIT","_id":"@airxpay/init-sdk@1.0.9","maintainers":[{"name":"tafseel1983","email":"tafseel1983@gmail.com"}],"homepage":"https://github.com/tafseelkhan/airxpay-init-sdk#readme","bugs":{"url":"https://github.com/tafseelkhan/airxpay-init-sdk/issues"},"dist":{"shasum":"aa686e5669a669d122d7cfa84dd7dcef523e6cd9","tarball":"https://registry.npmjs.org/@airxpay/init-sdk/-/init-sdk-1.0.9.tgz","fileCount":21,"integrity":"sha512-LO1/fRKudtB811Pi3j7oNTDfEOCGlLSgOAHaRtOazLJ46ZMODlz127LS02lDPGZiY28RHXhxUMEwrw05lBR55w==","signatures":[{"sig":"MEYCIQDDb9t9WpV/w17KZznuncs4PMz3/iZuRaB739pNJ79uogIhANjJd2MDVHpPJfi6PaR3GH6rgqiyQqFKqrStDazRNZ7q","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":228913},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"28734f904215fabf4cf05e5c203652489e82a2ba","scripts":{"build":"tsc --project tsconfig.json --outDir dist && cpx \"src/types/**/*\" dist/types && copyfiles -u 1 src/assets/**/* dist","prepare":"npm run build"},"_npmUser":{"name":"tafseel1983","email":"tafseel1983@gmail.com"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/tafseelkhan/airxpay-init-sdk.git","type":"git"},"_npmVersion":"9.9.4","description":"AirXPay Flixora SDK - merchant Onboard","directories":{},"_nodeVersion":"20.19.5","dependencies":{"axios":"^1.13.5"},"_hasShrinkwrap":false,"devDependencies":{"cpx":"^1.5.0","copyfiles":"^2.4.1","typescript":"^5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/init-sdk_1.0.9_1771389948769_0.06530308516451222","host":"s3://npm-registry-packages-npm-production"}}},"time":{"created":"2026-02-15T05:27:52.998Z","modified":"2026-02-18T11:47:15.067Z","1.0.0":"2026-02-15T05:27:53.551Z","1.0.1":"2026-02-15T06:36:47.868Z","1.0.2":"2026-02-15T07:06:01.203Z","1.0.3":"2026-02-15T07:54:05.136Z","1.0.5":"2026-02-15T08:10:16.199Z","1.0.4":"2026-02-15T08:14:42.782Z","1.0.6":"2026-02-15T08:20:24.398Z","1.0.8":"2026-02-15T13:24:19.094Z","1.0.9":"2026-02-18T04:45:48.991Z"},"bugs":{"url":"https://github.com/tafseelkhan/airxpay-init-sdk/issues"},"author":{"name":"Tafseel Khan"},"license":"MIT","homepage":"https://github.com/tafseelkhan/airxpay-init-sdk#readme","keywords":["airxpay","flixora","sdk","merchant","onboard"],"repository":{"url":"git+https://github.com/tafseelkhan/airxpay-init-sdk.git","type":"git"},"description":"AirXPay Flixora SDK - merchant Onboard","maintainers":[{"email":"support@npmjs.com","name":"npm-support"}],"readme":"# 🌟 AirXPay Flixora SDK - Backend Integration\r\n\r\n<div align=\"center\">\r\n  <img src=\"./src/assets/images/airxpay.png\" alt=\"AirXPay Flixora SDK\" width=\"120\"/>\r\n  <br/>\r\n  <br/>\r\n\r\n  <strong>🏢 Enterprise Merchant Onboarding Infrastructure for SaaS Platforms</strong>\r\n  <br/><br/>\r\n  <p>Build once. Onboard everywhere. 🚀</p>\r\n  <p>Powered by the Flixora Ecosystem ❤️</p>\r\n\r\n  <p>\r\n    <a href=\"#-installation\">\r\n      <img src=\"https://img.shields.io/npm/v/@airxpay/init-sdk?style=for-the-badge&logo=npm&color=red\" alt=\"npm version\" />\r\n    </a>\r\n    <a href=\"#-license\">\r\n      <img src=\"https://img.shields.io/badge/License-MIT-yellow?style=for-the-badge\" alt=\"license\" />\r\n    </a>\r\n    <a href=\"#-typescript\">\r\n      <img src=\"https://img.shields.io/badge/TypeScript-5.0+-blue?style=for-the-badge&logo=typescript\" alt=\"TypeScript\" />\r\n    </a>\r\n    <a href=\"#-nodejs\">\r\n      <img src=\"https://img.shields.io/badge/Node.js-18.x+-339933?style=for-the-badge&logo=nodedotjs\" alt=\"Node.js\" />\r\n    </a>\r\n    <a href=\"#-nestjs\">\r\n      <img src=\"https://img.shields.io/badge/NestJS-10.x+-E0234E?style=for-the-badge&logo=nestjs\" alt=\"NestJS\" />\r\n    </a>\r\n    <a href=\"#-express\">\r\n      <img src=\"https://img.shields.io/badge/Express-4.x+-000000?style=for-the-badge&logo=express\" alt=\"Express\" />\r\n    </a>\r\n  </p>\r\n</div>\r\n\r\n---\r\n\r\n## 🧠 What is AirXPay?\r\n\r\n**AirXPay Flixora SDK** is a production-ready TypeScript SDK that simplifies merchant onboarding for modern SaaS platforms. Built with multi-tenancy at its core, it provides a seamless backend integration experience for:\r\n\r\n| Feature | Description |\r\n|---------|-------------|\r\n| 🏪 **Merchant Creation** | Create verified merchant profiles with comprehensive business details |\r\n| 📄 **KYC Document Uploads** | Secure document submission and verification |\r\n| 🏦 **Bank Account Linking** | Add and update payout bank accounts with validation |\r\n| 📊 **Real-Time Status Tracking** | Monitor onboarding and KYC status in real-time |\r\n| 🔐 **Multi-Tenant Isolation** | Complete developer key isolation for multi-tenant architectures |\r\n\r\n---\r\n\r\n## 🌐 Ecosystem Powered By\r\n\r\n<div align=\"center\">\r\n  <table>\r\n    <tr>\r\n      <td align=\"center\">⚡ <strong>AirXPay</strong></td>\r\n      <td>Payments & payouts engine</td>\r\n    </tr>\r\n    <tr>\r\n      <td align=\"center\">💳 <strong>TizzyGo</strong></td>\r\n      <td>Payment routing layer with smart fallbacks</td>\r\n    </tr>\r\n    <tr>\r\n      <td align=\"center\">🧠 <strong>TizzyOS</strong></td>\r\n      <td>Financial operating system infrastructure</td>\r\n    </tr>\r\n    <tr>\r\n      <td align=\"center\">💬 <strong>TizzyChat</strong></td>\r\n      <td>Real-time notifications (Coming Soon)</td>\r\n    </tr>\r\n  </table>\r\n</div>\r\n\r\n---\r\n\r\n## 🚀 Version\r\n\r\n<h3 align=\"center\">\r\n  <code>v1.0.8</code>\r\n  <br/>\r\n  <sub>Synced with ecosystem apps for version consistency ❤️</sub>\r\n  <br/>\r\n  <sub>We have updated this package from v1.0.6 → v1.0.8 to match app versions. Thanks for understanding! 😊❤️</sub>\r\n</h3>\r\n\r\n---\r\n\r\n## 🏗 Backend Architecture\r\n\r\n```\r\n┌─────────────────────────────────────┐\r\n│         Your Backend Service        │\r\n│  (Node.js / Express / NestJS / etc) │\r\n└──────────────┬──────────────────────┘\r\n               │\r\n               ▼\r\n      ┌─────────────────┐\r\n      │ AirXPay Flixora │\r\n      │   SDK (Backend) │\r\n      └─────────────────┘\r\n               │\r\n               ▼\r\n     ┌──────────────────┐\r\n     │   AirXPay API    │\r\n     │     Gateway      │\r\n     └──────────────────┘\r\n               │\r\n    ┌──────────┼──────────┐\r\n    ▼          ▼          ▼\r\n┌────────┐ ┌────────┐ ┌────────┐\r\n│TizzyGo │ │TizzyOS │ │TizzyChat*\r\n│Payment │ │Financial│ │  (Soon) │\r\n│Routing │ │Processing│ │Notifica-│\r\n└────────┘ └────────┘ └───tions─┘\r\n```\r\n\r\n> **Note**: Multi-tenant isolation is automatically handled via developer keys. Each tenant operates in a completely isolated environment.\r\n\r\n---\r\n\r\n## ✨ Core Features\r\n\r\n| Feature | Status | Description |\r\n|---------|--------|-------------|\r\n| 🧑‍💼 Merchant Creation | ✅ | Create verified merchant profiles with business details |\r\n| 📂 KYC Upload | ✅ | Upload and verify KYC documents |\r\n| 🏦 Bank Integration | ✅ | Add/Update payout bank accounts with validation |\r\n| 📡 Status Tracking | ✅ | Poll onboarding & KYC status in real-time |\r\n| 🏢 Multi-Tenant Ready | ✅ | Isolated developer key architecture |\r\n| 🧠 TypeScript First | ✅ | Full IntelliSense + type safety |\r\n| 🚀 Express Middleware | ✅ | Ready-to-use Express middleware |\r\n| 🏗 NestJS Module | ✅ | Complete NestJS module integration |\r\n| 🔁 Auto Retry & Logging | ✅ | Built-in axios interceptors |\r\n| 🔐 Secure Key Validation | ✅ | Encrypted & validated requests |\r\n\r\n---\r\n\r\n## 📦 Installation\r\n\r\n### NPM\r\n```bash\r\nnpm install @airxpay/init-sdk\r\n```\r\n\r\n### Yarn\r\n```bash\r\nyarn add @airxpay/init-sdk\r\n```\r\n\r\n### PNPM\r\n```bash\r\npnpm add @airxpay/init-sdk\r\n```\r\n\r\n### Peer Dependencies\r\n```bash\r\nnpm install axios dotenv\r\n# or\r\nyarn add axios dotenv\r\n```\r\n\r\n---\r\n\r\n## ⚙️ Environment Setup\r\n\r\n### .env\r\n```env\r\n# AirXPay Configuration\r\nAIRXPAY_BASE_URL=https://api.airxpay.com\r\nAIRXPAY_SECRET_KEY=sk_live_your_secret_key_here\r\nAIRXPAY_CLIENT_KEY=ck_live_your_client_key_here\r\n\r\n```\r\n\r\n### Environment Validation\r\n```typescript\r\n// config/env.ts\r\nimport dotenv from \"dotenv\";\r\ndotenv.config();\r\n\r\nexport const env = {\r\n  airxpay: {\r\n    baseUrl: process.env.AIRXPAY_BASE_URL!,\r\n    publicKey: process.env.AIRXPAY_PUBLIC_KEY!,\r\n    secretKey: process.env.AIRXPAY_SECRET_KEY!,\r\n    clientKey: process.env.AIRXPAY_CLIENT_KEY!\r\n  },\r\n};\r\n\r\n// Validate required variables\r\nconst requiredEnvVars = [\r\n  'AIRXPAY_BASE_URL',\r\n  'AIRXPAY_SECRET_KEY',\r\n  'AIRXPAY_CLIENT_KEY'\r\n];\r\n\r\nrequiredEnvVars.forEach(envVar => {\r\n  if (!process.env[envVar]) {\r\n    throw new Error(`Missing required environment variable: ${envVar}`);\r\n  }\r\n});\r\n```\r\n\r\n---\r\n\r\n## 🏗 SDK Initialization\r\n\r\n### Basic Initialization\r\n```typescript\r\n// lib/airxpay.ts\r\nimport { AirXPay } from \"@airxpay/init-sdk\";\r\nimport { env } from \"../config/env\";\r\n\r\nexport const airxpay = new AirXPay({\r\n  baseUrl: env.airxpay.baseUrl,\r\n  secretKey: env.airxpay.secretKey,\r\n  clientKey: env.airxpay.clientKey\r\n});\r\n```\r\n\r\n### Singleton Pattern\r\n```typescript\r\n// lib/airxpay-singleton.ts\r\nimport { AirXPay } from \"@airxpay/init-sdk\";\r\nimport { env } from \"../config/env\";\r\n\r\nclass AirXPaySingleton {\r\n  private static instance: AirXPay;\r\n\r\n  private constructor() {}\r\n\r\n  public static getInstance(): AirXPay {\r\n    if (!AirXPaySingleton.instance) {\r\n      AirXPaySingleton.instance = new AirXPay({\r\n        baseUrl: env.airxpay.baseUrl,\r\n        secretKey: env.airxpay.secretKey,\r\n        clientKey: env.airxpay.clientKey\r\n      });\r\n    }\r\n    return AirXPaySingleton.instance;\r\n  }\r\n}\r\n\r\nexport const airxpay = AirXPaySingleton.getInstance();\r\n```\r\n\r\n---\r\n\r\n## 📘 Available Imports\r\n\r\n| Import | Type | Purpose |\r\n|--------|------|---------|\r\n| `AirXPay` | `Class` | Main SDK class for all operations |\r\n| `Merchant` | `Interface` | Merchant TypeScript interface |\r\n| `Keys` | `Interface` | Developer key structure |\r\n| `validateKeys` | `Function` | Pre-validate authentication keys |\r\n| `base64ToBlob` | `Function` | Convert base64 to Blob for uploads |\r\n| `OnboardingStatus` | `Enum` | Status tracking enum |\r\n| `BusinessType` | `Enum` | Business type enumeration |\r\n| `KycDocumentType` | `Enum` | KYC document types |\r\n| `BankAccountType` | `Enum` | Bank account types |\r\n\r\n> **💎 Highly recommended for TypeScript projects**\r\n\r\n---\r\n\r\n## 🔌 API Methods\r\n\r\n| Method | Parameters | Return Type | Description |\r\n|--------|------------|-------------|-------------|\r\n| `createMerchant()` | `(merchant: Merchant, keys: Keys)` | `Promise<MerchantResponse>` | Create new merchant profile |\r\n| `updateKyc()` | `(merchantId: string, documents: KycDocument[])` | `Promise<KycStatus>` | Upload KYC documents |\r\n| `updateBank()` | `(merchantId: string, bankDetails: BankDetails)` | `Promise<BankResponse>` | Update bank account details |\r\n| `getPendingStatus()` | `(merchantId: string)` | `Promise<OnboardingStatus>` | Fetch onboarding status |\r\n| `validateMerchant()` | `(merchantId: string)` | `Promise<ValidationResult>` | Validate merchant information |\r\n| `getMerchantById()` | `(merchantId: string)` | `Promise<Merchant>` | Get merchant details |\r\n| `listMerchants()` | `(filters?: MerchantFilters)` | `Promise<Merchant[]>` | List merchants with filters |\r\n| `deleteMerchant()` | `(merchantId: string)` | `Promise<void>` | Delete merchant (soft delete) |\r\n\r\n---\r\n\r\n## 💻 Usage Examples\r\n\r\n### 🔹 Basic Express API\r\n\r\n```typescript\r\n// server.ts\r\nimport express, { Request, Response } from 'express';\r\nimport { airxpay } from './lib/airxpay';\r\nimport { validateKeys } from '@airxpay/init-sdk';\r\nimport type { Merchant, Keys } from '@airxpay/init-sdk';\r\nimport { env } from './config/env';\r\n\r\nconst app = express();\r\napp.use(express.json());\r\n\r\n// Create merchant endpoint\r\napp.post('/api/merchants', async (req: Request, res: Response) => {\r\n  try {\r\n    const merchantData: Merchant = req.body;\r\n    \r\n    const keys: Keys = {\r\n      publicKey: env.airxpay.publicKey,\r\n      secretKey: env.airxpay.secretKey,\r\n      clientKey: env.airxpay.clientKey\r\n    };\r\n\r\n    // Optional pre-validation\r\n    validateKeys(keys);\r\n\r\n    const result = await airxpay.createMerchant(merchantData, keys);\r\n    \r\n    res.status(201).json({\r\n      success: true,\r\n      data: result\r\n    });\r\n  } catch (error: any) {\r\n    res.status(error.response?.status || 500).json({\r\n      success: false,\r\n      error: error.message\r\n    });\r\n  }\r\n});\r\n\r\n// Get merchant status\r\napp.get('/api/merchants/:merchantId/status', async (req: Request, res: Response) => {\r\n  try {\r\n    const { merchantId } = req.params;\r\n    const status = await airxpay.getPendingStatus(merchantId);\r\n    \r\n    res.json({\r\n      success: true,\r\n      data: status\r\n    });\r\n  } catch (error: any) {\r\n    res.status(error.response?.status || 500).json({\r\n      success: false,\r\n      error: error.message\r\n    });\r\n  }\r\n});\r\n\r\n// Update KYC\r\napp.post('/api/merchants/:merchantId/kyc', async (req: Request, res: Response) => {\r\n  try {\r\n    const { merchantId } = req.params;\r\n    const { documents } = req.body;\r\n    \r\n    const result = await airxpay.updateKyc(merchantId, documents);\r\n    \r\n    res.json({\r\n      success: true,\r\n      data: result\r\n    });\r\n  } catch (error: any) {\r\n    res.status(error.response?.status || 500).json({\r\n      success: false,\r\n      error: error.message\r\n    });\r\n  }\r\n});\r\n\r\n// Update bank details\r\napp.put('/api/merchants/:merchantId/bank', async (req: Request, res: Response) => {\r\n  try {\r\n    const { merchantId } = req.params;\r\n    const bankDetails = req.body;\r\n    \r\n    const result = await airxpay.updateBank(merchantId, bankDetails);\r\n    \r\n    res.json({\r\n      success: true,\r\n      data: result\r\n    });\r\n  } catch (error: any) {\r\n    res.status(error.response?.status || 500).json({\r\n      success: false,\r\n      error: error.message\r\n    });\r\n  }\r\n});\r\n\r\napp.listen(3000, () => {\r\n  console.log('Server running on port 3000');\r\n});\r\n```\r\n\r\n### 🔹 Express with Middleware\r\n\r\n```typescript\r\n// middleware/auth.ts\r\nimport { Request, Response, NextFunction } from 'express';\r\nimport { validateKeys } from '@airxpay/init-sdk';\r\nimport { env } from '../config/env';\r\n\r\nexport const validateAirXPayKeys = (req: Request, res: Response, next: NextFunction) => {\r\n  try {\r\n    const keys = {\r\n      publicKey: env.airxpay.publicKey,\r\n      secretKey: env.airxpay.secretKey,\r\n      clientKey: env.airxpay.clientKey\r\n    };\r\n    \r\n    validateKeys(keys);\r\n    next();\r\n  } catch (error) {\r\n    res.status(401).json({\r\n      success: false,\r\n      error: 'Invalid API keys configuration'\r\n    });\r\n  }\r\n};\r\n\r\n// middleware/errorHandler.ts\r\nimport { Request, Response, NextFunction } from 'express';\r\n\r\nexport const airXPayErrorHandler = (error: any, req: Request, res: Response, next: NextFunction) => {\r\n  if (error.response) {\r\n    // AirXPay API error\r\n    const { status, data } = error.response;\r\n    res.status(status).json({\r\n      success: false,\r\n      error: data.message || 'AirXPay API error',\r\n      code: data.code\r\n    });\r\n  } else if (error.request) {\r\n    // Network error\r\n    res.status(503).json({\r\n      success: false,\r\n      error: 'Unable to reach AirXPay service'\r\n    });\r\n  } else {\r\n    // Other errors\r\n    res.status(500).json({\r\n      success: false,\r\n      error: error.message\r\n    });\r\n  }\r\n};\r\n```\r\n\r\n### 🔹 Complete Express Application\r\n\r\n```typescript\r\n// app.ts\r\nimport express from 'express';\r\nimport { airxpay } from './lib/airxpay';\r\nimport { validateAirXPayKeys } from './middleware/auth';\r\nimport { airXPayErrorHandler } from './middleware/errorHandler';\r\nimport { env } from './config/env';\r\n\r\nconst app = express();\r\n\r\n// Middleware\r\napp.use(express.json());\r\napp.use(validateAirXPayKeys);\r\n\r\n// Routes\r\napp.post('/api/v1/merchants', async (req, res, next) => {\r\n  try {\r\n    const result = await airxpay.createMerchant(req.body, {\r\n      publicKey: env.airxpay.publicKey,\r\n      secretKey: env.airxpay.secretKey,\r\n      clientKey: env.airxpay.clientKey\r\n    });\r\n    \r\n    res.status(201).json(result);\r\n  } catch (error) {\r\n    next(error);\r\n  }\r\n});\r\n\r\napp.get('/api/v1/merchants/:id', async (req, res, next) => {\r\n  try {\r\n    const merchant = await airxpay.getMerchantById(req.params.id);\r\n    res.json(merchant);\r\n  } catch (error) {\r\n    next(error);\r\n  }\r\n});\r\n\r\napp.get('/api/v1/merchants', async (req, res, next) => {\r\n  try {\r\n    const merchants = await airxpay.listMerchants(req.query);\r\n    res.json(merchants);\r\n  } catch (error) {\r\n    next(error);\r\n  }\r\n});\r\n\r\napp.post('/api/v1/merchants/:id/kyc', async (req, res, next) => {\r\n  try {\r\n    const result = await airxpay.updateKyc(req.params.id, req.body.documents);\r\n    res.json(result);\r\n  } catch (error) {\r\n    next(error);\r\n  }\r\n});\r\n\r\napp.put('/api/v1/merchants/:id/bank', async (req, res, next) => {\r\n  try {\r\n    const result = await airxpay.updateBank(req.params.id, req.body);\r\n    res.json(result);\r\n  } catch (error) {\r\n    next(error);\r\n  }\r\n});\r\n\r\napp.get('/api/v1/merchants/:id/status', async (req, res, next) => {\r\n  try {\r\n    const status = await airxpay.getPendingStatus(req.params.id);\r\n    res.json(status);\r\n  } catch (error) {\r\n    next(error);\r\n  }\r\n});\r\n\r\n// Error handling\r\napp.use(airXPayErrorHandler);\r\n\r\napp.listen(env.port, () => {\r\n  console.log(`Server running on port ${env.port}`);\r\n});\r\n```\r\n\r\n---\r\n\r\n### 🔹 NestJS Module Integration\r\n\r\n```typescript\r\n// airxpay.module.ts\r\nimport { Module, Global } from '@nestjs/common';\r\nimport { AirXPayService } from './airxpay.service';\r\nimport { AirXPayController } from './airxpay.controller';\r\nimport { ConfigModule, ConfigService } from '@nestjs/config';\r\n\r\n@Global()\r\n@Module({\r\n  imports: [ConfigModule],\r\n  providers: [\r\n    {\r\n      provide: 'AIRXPAY_OPTIONS',\r\n      useFactory: (configService: ConfigService) => ({\r\n        baseUrl: configService.get('AIRXPAY_BASE_URL'),\r\n        secretKey: configService.get('AIRXPAY_SECRET_KEY'),\r\n        clientKey: configService.get('AIRXPAY_CLIENT_KEY')\r\n      }),\r\n      inject: [ConfigService]\r\n    },\r\n    AirXPayService\r\n  ],\r\n  controllers: [AirXPayController],\r\n  exports: [AirXPayService]\r\n})\r\nexport class AirXPayModule {}\r\n\r\n// airxpay.service.ts\r\nimport { Injectable, Inject } from '@nestjs/common';\r\nimport { AirXPay } from '@airxpay/init-sdk';\r\nimport type { Merchant, Keys, BankDetails, KycDocument } from '@airxpay/init-sdk';\r\n\r\n@Injectable()\r\nexport class AirXPayService {\r\n  private sdk: AirXPay;\r\n  private keys: Keys;\r\n\r\n  constructor(@Inject('AIRXPAY_OPTIONS') private options: any) {\r\n    this.sdk = new AirXPay(options);\r\n    this.keys = {\r\n      publicKey: options.publicKey,\r\n      secretKey: options.secretKey,\r\n      clientKey: options.clientKey\r\n    };\r\n  }\r\n\r\n  async createMerchant(merchantData: Merchant) {\r\n    return this.sdk.createMerchant(merchantData, this.keys);\r\n  }\r\n\r\n  async getMerchant(merchantId: string) {\r\n    return this.sdk.getMerchantById(merchantId);\r\n  }\r\n\r\n  async listMerchants(filters?: any) {\r\n    return this.sdk.listMerchants(filters);\r\n  }\r\n\r\n  async updateKyc(merchantId: string, documents: KycDocument[]) {\r\n    return this.sdk.updateKyc(merchantId, documents);\r\n  }\r\n\r\n  async updateBank(merchantId: string, bankDetails: BankDetails) {\r\n    return this.sdk.updateBank(merchantId, bankDetails);\r\n  }\r\n\r\n  async getStatus(merchantId: string) {\r\n    return this.sdk.getPendingStatus(merchantId);\r\n  }\r\n\r\n  async deleteMerchant(merchantId: string) {\r\n    return this.sdk.deleteMerchant(merchantId);\r\n  }\r\n}\r\n\r\n// airxpay.controller.ts\r\nimport { Controller, Post, Get, Put, Body, Param, Query } from '@nestjs/common';\r\nimport { AirXPayService } from './airxpay.service';\r\n\r\n@Controller('api/v1/merchants')\r\nexport class AirXPayController {\r\n  constructor(private readonly airxpayService: AirXPayService) {}\r\n\r\n  @Post()\r\n  async createMerchant(@Body() merchantData: any) {\r\n    return this.airxpayService.createMerchant(merchantData);\r\n  }\r\n\r\n  @Get(':id')\r\n  async getMerchant(@Param('id') id: string) {\r\n    return this.airxpayService.getMerchant(id);\r\n  }\r\n\r\n  @Get()\r\n  async listMerchants(@Query() filters: any) {\r\n    return this.airxpayService.listMerchants(filters);\r\n  }\r\n\r\n  @Post(':id/kyc')\r\n  async updateKyc(@Param('id') id: string, @Body('documents') documents: any[]) {\r\n    return this.airxpayService.updateKyc(id, documents);\r\n  }\r\n\r\n  @Put(':id/bank')\r\n  async updateBank(@Param('id') id: string, @Body() bankDetails: any) {\r\n    return this.airxpayService.updateBank(id, bankDetails);\r\n  }\r\n\r\n  @Get(':id/status')\r\n  async getStatus(@Param('id') id: string) {\r\n    return this.airxpayService.getStatus(id);\r\n  }\r\n\r\n  @Post(':id/delete')\r\n  async deleteMerchant(@Param('id') id: string) {\r\n    return this.airxpayService.deleteMerchant(id);\r\n  }\r\n}\r\n```\r\n\r\n---\r\n\r\n### 🔹 TypeScript Service Class\r\n\r\n```typescript\r\n// services/MerchantService.ts\r\nimport { AirXPay, validateKeys } from '@airxpay/init-sdk';\r\nimport type { Merchant, Keys, BankDetails, KycDocument } from '@airxpay/init-sdk';\r\nimport { env } from '../config/env';\r\n\r\nexport class MerchantService {\r\n  private sdk: AirXPay;\r\n  private keys: Keys;\r\n\r\n  constructor() {\r\n    this.sdk = new AirXPay({\r\n      baseUrl: env.airxpay.baseUrl,\r\n      secretKey: env.airxpay.secretKey,\r\n      clientKey: env.airxpay.clientKey\r\n    });\r\n\r\n    this.keys = {\r\n      publicKey: env.airxpay.publicKey,\r\n      secretKey: env.airxpay.secretKey,\r\n      clientKey: env.airxpay.clientKey\r\n    };\r\n\r\n    validateKeys(this.keys);\r\n  }\r\n\r\n  async onboardMerchant(merchantData: Merchant) {\r\n    try {\r\n      // Step 1: Create merchant\r\n      const merchant = await this.sdk.createMerchant(merchantData, this.keys);\r\n      \r\n      // Step 2: Return merchant ID for next steps\r\n      return {\r\n        success: true,\r\n        merchantId: merchant.id,\r\n        message: 'Merchant created successfully. Proceed to KYC.'\r\n      };\r\n    } catch (error) {\r\n      throw this.handleError(error);\r\n    }\r\n  }\r\n\r\n  async submitKyc(merchantId: string, documents: KycDocument[]) {\r\n    try {\r\n      const result = await this.sdk.updateKyc(merchantId, documents);\r\n      return {\r\n        success: true,\r\n        status: result.status,\r\n        message: 'KYC submitted successfully'\r\n      };\r\n    } catch (error) {\r\n      throw this.handleError(error);\r\n    }\r\n  }\r\n\r\n  async addBankDetails(merchantId: string, bankDetails: BankDetails) {\r\n    try {\r\n      const result = await this.sdk.updateBank(merchantId, bankDetails);\r\n      return {\r\n        success: true,\r\n        bankAccount: result,\r\n        message: 'Bank details added successfully'\r\n      };\r\n    } catch (error) {\r\n      throw this.handleError(error);\r\n    }\r\n  }\r\n\r\n  async getOnboardingStatus(merchantId: string) {\r\n    try {\r\n      const status = await this.sdk.getPendingStatus(merchantId);\r\n      return {\r\n        success: true,\r\n        status,\r\n        isComplete: status === 'COMPLETED'\r\n      };\r\n    } catch (error) {\r\n      throw this.handleError(error);\r\n    }\r\n  }\r\n\r\n  private handleError(error: any) {\r\n    // Log error\r\n    console.error('AirXPay Error:', {\r\n      status: error.response?.status,\r\n      data: error.response?.data,\r\n      message: error.message\r\n    });\r\n\r\n    // Return formatted error\r\n    return {\r\n      success: false,\r\n      error: error.response?.data?.message || error.message,\r\n      code: error.response?.data?.code || 'UNKNOWN_ERROR'\r\n    };\r\n  }\r\n}\r\n```\r\n\r\n---\r\n\r\n### 🔹 Background Job Processing\r\n\r\n```typescript\r\n// jobs/onboardingMonitor.ts\r\nimport { MerchantService } from '../services/MerchantService';\r\nimport { Queue, Worker } from 'bullmq';\r\n\r\nconst merchantService = new MerchantService();\r\nconst onboardingQueue = new Queue('onboarding-status');\r\n\r\n// Add jobs to queue\r\nexport async function monitorOnboardingStatus(merchantId: string) {\r\n  await onboardingQueue.add('check-status', { merchantId }, {\r\n    repeat: {\r\n      every: 60000 // Check every minute\r\n    },\r\n    attempts: 10,\r\n    backoff: {\r\n      type: 'exponential',\r\n      delay: 60000\r\n    }\r\n  });\r\n}\r\n\r\n// Process queue\r\nconst worker = new Worker('onboarding-status', async job => {\r\n  const { merchantId } = job.data;\r\n  \r\n  try {\r\n    const status = await merchantService.getOnboardingStatus(merchantId);\r\n    \r\n    if (status.isComplete) {\r\n      // Onboarding complete - trigger webhook\r\n      await triggerWebhook(merchantId, status);\r\n      return; // Stop monitoring\r\n    }\r\n    \r\n    // Re-queue if not complete\r\n    await monitorOnboardingStatus(merchantId);\r\n  } catch (error) {\r\n    console.error(`Failed to check status for merchant ${merchantId}:`, error);\r\n  }\r\n});\r\n\r\nasync function triggerWebhook(merchantId: string, status: any) {\r\n  // Send webhook to your application\r\n  await fetch('https://your-app.com/webhooks/onboarding-complete', {\r\n    method: 'POST',\r\n    headers: { 'Content-Type': 'application/json' },\r\n    body: JSON.stringify({ merchantId, status })\r\n  });\r\n}\r\n```\r\n\r\n---\r\n\r\n## 📁 Folder Structure\r\n\r\n```\r\nairxpay-backend/\r\n├── 📁 src/\r\n│   ├── 📄 index.ts                    # Main entry point\r\n│   ├── 📁 lib/\r\n│   │   ├── 📄 airxpay.ts              # SDK initialization\r\n│   │   └── 📄 singleton.ts             # Singleton pattern\r\n│   ├── 📁 config/\r\n│   │   ├── 📄 env.ts                   # Environment config\r\n│   │   └── 📄 constants.ts              # Constants\r\n│   ├── 📁 services/\r\n│   │   ├── 📄 merchant.service.ts        # Merchant service\r\n│   │   ├── 📄 kyc.service.ts           # KYC service\r\n│   │   └── 📄 bank.service.ts          # Bank service\r\n│   ├── 📁 controllers/\r\n│   │   ├── 📄 merchant.controller.ts     # Express controller\r\n│   │   └── 📄 webhook.controller.ts    # Webhook handler\r\n│   ├── 📁 middleware/\r\n│   │   ├── 📄 auth.ts                   # Auth middleware\r\n│   │   └── 📄 errorHandler.ts           # Error handling\r\n│   ├── 📁 jobs/\r\n│   │   ├── 📄 onboarding-monitor.ts    # Background jobs\r\n│   │   └── 📄 queue.ts                  # Queue setup\r\n│   ├── 📁 types/\r\n│   │   ├── 📄 merchant.ts                 # Merchant types\r\n│   │   ├── 📄 bank.ts                    # Bank types\r\n│   │   └── 📄 kyc.ts                     # KYC types\r\n│   └── 📁 utils/\r\n│       ├── 📄 validation.ts              # Validation utils\r\n│       └── 📄 logging.ts                  # Logging setup\r\n├── 📁 dist/                               # Compiled output\r\n├── 📄 package.json\r\n├── 📄 tsconfig.json\r\n├── 📄 README.md\r\n├── 📄 .env.example\r\n└── 📄 .gitignore\r\n```\r\n\r\n---\r\n\r\n## 🔐 Security & Compliance\r\n\r\n### Key Security Features\r\n\r\n- **🔒 Encrypted Key Transmission**: All keys are encrypted during transmission\r\n- **🛡️ Secret Key Protection**: Secret key never exposed to client-side\r\n- **👥 Multi-tenant Isolation**: Complete developer key isolation\r\n- **✅ Input Validation**: Comprehensive validation before request dispatch\r\n- **📝 Audit Logging**: Complete audit trail for all operations\r\n- **🔑 Key Rotation**: Support for seamless key rotation\r\n\r\n### Security Best Practices\r\n\r\n```typescript\r\n// config/security.ts\r\nimport { randomBytes } from 'crypto';\r\nimport { env } from './env';\r\n\r\nexport const securityConfig = {\r\n  // Rate limiting\r\n  rateLimit: {\r\n    windowMs: 15 * 60 * 1000, // 15 minutes\r\n    max: 100 // limit each IP to 100 requests per windowMs\r\n  },\r\n\r\n  // Key rotation\r\n  keyRotation: {\r\n    enabled: true,\r\n    interval: '30d', // Rotate every 30 days\r\n    gracePeriod: '7d' // Old keys valid for 7 days after rotation\r\n  },\r\n\r\n  // Audit logging\r\n  auditLog: {\r\n    enabled: true,\r\n    events: [\r\n      'MERCHANT_CREATED',\r\n      'KYC_UPLOADED',\r\n      'BANK_UPDATED',\r\n      'STATUS_CHECKED'\r\n    ],\r\n    retention: '90d' // Keep logs for 90 days\r\n  }\r\n};\r\n\r\n// Generate request ID for tracking\r\nexport const generateRequestId = (): string => {\r\n  return randomBytes(16).toString('hex');\r\n};\r\n```\r\n\r\n---\r\n\r\n## 🔴 Error Handling Matrix\r\n\r\n| Status | Meaning | Recommended Action |\r\n|--------|---------|-------------------|\r\n| **200** | Success | Process response normally |\r\n| **201** | Created | Resource created successfully |\r\n| **400** | Bad Request | Validate input parameters |\r\n| **401** | Unauthorized | Check API keys and regenerate if needed |\r\n| **403** | Forbidden | Verify permissions and access rights |\r\n| **404** | Not Found | Verify merchant ID exists |\r\n| **409** | Conflict | Handle duplicate entries gracefully |\r\n| **422** | Unprocessable Entity | Check KYC document format |\r\n| **429** | Too Many Requests | Implement exponential backoff |\r\n| **500** | Server Error | Retry with exponential backoff |\r\n| **502** | Bad Gateway | Check network connectivity |\r\n| **503** | Service Unavailable | Check service status |\r\n\r\n### Error Handling Service\r\n\r\n```typescript\r\n// utils/errorHandler.ts\r\nexport class AirXPayErrorHandler {\r\n  static handle(error: any) {\r\n    if (error.response) {\r\n      // The request was made and the server responded with a status code\r\n      const { status, data } = error.response;\r\n      \r\n      switch (status) {\r\n        case 400:\r\n          return {\r\n            code: 'VALIDATION_ERROR',\r\n            message: data.message || 'Invalid input data',\r\n            retry: false\r\n          };\r\n        case 401:\r\n          return {\r\n            code: 'AUTH_ERROR',\r\n            message: 'Invalid API keys',\r\n            retry: false,\r\n            action: 'REFRESH_KEYS'\r\n          };\r\n        case 403:\r\n          return {\r\n            code: 'FORBIDDEN',\r\n            message: 'Access denied',\r\n            retry: false,\r\n            action: 'CHECK_PERMISSIONS'\r\n          };\r\n        case 404:\r\n          return {\r\n            code: 'NOT_FOUND',\r\n            message: 'Resource not found',\r\n            retry: false\r\n          };\r\n        case 409:\r\n          return {\r\n            code: 'CONFLICT',\r\n            message: 'Resource already exists',\r\n            retry: false\r\n          };\r\n        case 422:\r\n          return {\r\n            code: 'KYC_ERROR',\r\n            message: data.message || 'KYC validation failed',\r\n            retry: true,\r\n            details: data.details\r\n          };\r\n        case 429:\r\n          return {\r\n            code: 'RATE_LIMIT',\r\n            message: 'Too many requests',\r\n            retry: true,\r\n            retryAfter: data.retryAfter || 60\r\n          };\r\n        case 500:\r\n        case 502:\r\n        case 503:\r\n          return {\r\n            code: 'SERVER_ERROR',\r\n            message: 'AirXPay service unavailable',\r\n            retry: true,\r\n            retryAfter: 30\r\n          };\r\n        default:\r\n          return {\r\n            code: 'UNKNOWN_ERROR',\r\n            message: error.message,\r\n            retry: false\r\n          };\r\n      }\r\n    } else if (error.request) {\r\n      // The request was made but no response was received\r\n      return {\r\n        code: 'NETWORK_ERROR',\r\n        message: 'Unable to reach AirXPay service',\r\n        retry: true,\r\n        retryAfter: 10\r\n      };\r\n    } else {\r\n      // Something happened in setting up the request\r\n      return {\r\n        code: 'REQUEST_SETUP_ERROR',\r\n        message: error.message,\r\n        retry: false\r\n      };\r\n    }\r\n  }\r\n}\r\n```\r\n\r\n---\r\n\r\n## 🧩 Advanced Backend Patterns\r\n\r\n### 🔄 Multi-Tenant Factory Pattern\r\n\r\n```typescript\r\n// lib/multi-tenant-factory.ts\r\nimport { AirXPay } from '@airxpay/init-sdk';\r\nimport type { Keys } from '@airxpay/init-sdk';\r\n\r\ninterface TenantConfig {\r\n  tenantId: string;\r\n  baseUrl: string;\r\n  keys: Keys;\r\n}\r\n\r\nexport class AirXPayTenantFactory {\r\n  private tenants: Map<string, AirXPay> = new Map();\r\n\r\n  registerTenant(config: TenantConfig): void {\r\n    const sdk = new AirXPay({\r\n      baseUrl: config.baseUrl,\r\n      secretKey: config.keys.secretKey,\r\n      clientKey: config.keys.clientKey\r\n    });\r\n\r\n    this.tenants.set(config.tenantId, sdk);\r\n  }\r\n\r\n  getForTenant(tenantId: string): AirXPay {\r\n    const sdk = this.tenants.get(tenantId);\r\n    if (!sdk) {\r\n      throw new Error(`No SDK found for tenant: ${tenantId}`);\r\n    }\r\n    return sdk;\r\n  }\r\n\r\n  removeTenant(tenantId: string): void {\r\n    this.tenants.delete(tenantId);\r\n  }\r\n}\r\n```\r\n\r\n### 🎯 Repository Pattern\r\n\r\n```typescript\r\n// repositories/merchant.repository.ts\r\nimport { AirXPay } from '@airxpay/init-sdk';\r\nimport type { Merchant, MerchantFilters } from '@airxpay/init-sdk';\r\n\r\nexport class MerchantRepository {\r\n  constructor(private sdk: AirXPay, private keys: any) {}\r\n\r\n  async create(merchantData: Merchant) {\r\n    return this.sdk.createMerchant(merchantData, this.keys);\r\n  }\r\n\r\n  async findById(id: string) {\r\n    return this.sdk.getMerchantById(id);\r\n  }\r\n\r\n  async findAll(filters?: MerchantFilters) {\r\n    return this.sdk.listMerchants(filters);\r\n  }\r\n\r\n  async updateKYC(id: string, documents: any[]) {\r\n    return this.sdk.updateKyc(id, documents);\r\n  }\r\n\r\n  async updateBank(id: string, bankDetails: any) {\r\n    return this.sdk.updateBank(id, bankDetails);\r\n  }\r\n\r\n  async getStatus(id: string) {\r\n    return this.sdk.getPendingStatus(id);\r\n  }\r\n\r\n  async delete(id: string) {\r\n    return this.sdk.deleteMerchant(id);\r\n  }\r\n}\r\n```\r\n\r\n### 📊 Caching Layer\r\n\r\n```typescript\r\n// cache/merchant.cache.ts\r\nimport NodeCache from 'node-cache';\r\nimport { MerchantRepository } from '../repositories/merchant.repository';\r\n\r\nexport class MerchantCache {\r\n  private cache: NodeCache;\r\n  private ttl = 300; // 5 minutes\r\n\r\n  constructor(private repository: MerchantRepository) {\r\n    this.cache = new NodeCache({ stdTTL: this.ttl });\r\n  }\r\n\r\n  async getMerchant(id: string) {\r\n    const cacheKey = `merchant:${id}`;\r\n    \r\n    // Try cache first\r\n    let merchant = this.cache.get(cacheKey);\r\n    \r\n    if (!merchant) {\r\n      // Cache miss - fetch from API\r\n      merchant = await this.repository.findById(id);\r\n      this.cache.set(cacheKey, merchant);\r\n    }\r\n    \r\n    return merchant;\r\n  }\r\n\r\n  async getStatus(id: string) {\r\n    const cacheKey = `status:${id}`;\r\n    \r\n    let status = this.cache.get(cacheKey);\r\n    \r\n    if (!status) {\r\n      status = await this.repository.getStatus(id);\r\n      this.cache.set(cacheKey, status, 60); // 1 minute TTL for status\r\n    }\r\n    \r\n    return status;\r\n  }\r\n\r\n  invalidate(id: string) {\r\n    this.cache.del(`merchant:${id}`);\r\n    this.cache.del(`status:${id}`);\r\n  }\r\n}\r\n```\r\n\r\n---\r\n\r\n## 🌙 Dark Mode Optimization\r\n\r\nThis README is optimized for:\r\n\r\n- **GitHub Dark Theme** - Perfect contrast and readability\r\n- **Clean badge contrast** - High visibility badges\r\n- **Monospace clarity** - Crystal clear code blocks\r\n- **Center-aligned hero section** - Professional presentation\r\n\r\n---\r\n\r\n## ❓ Backend FAQ\r\n\r\n### Can I use this in production?\r\n\r\n✅ **Yes!** The SDK is production-ready and used by multiple enterprise SaaS platforms.\r\n\r\n### Does it support rate limiting?\r\n\r\n✅ **Yes!** The SDK has built-in support for rate limiting and exponential backoff.\r\n\r\n### Can I use it with Express?\r\n\r\n✅ **Yes!** Check out the Express examples above with full middleware support.\r\n\r\n### Does it work with NestJS?\r\n\r\n✅ **Yes!** Complete NestJS module integration is provided.\r\n\r\n### How do I handle webhooks?\r\n\r\nThe SDK provides webhook verification and handling utilities. Check the webhook controller example.\r\n\r\n### Is there caching support?\r\n\r\n✅ **Yes!** Implement the caching layer pattern shown above for optimal performance.\r\n\r\n### What about error handling?\r\n\r\nComprehensive error handling with status code matrix and retry logic is built-in.\r\n\r\n### Can I monitor onboarding status in background?\r\n\r\n✅ **Yes!** Use the background job processing example with BullMQ.\r\n\r\n---\r\n\r\n## 📞 Support & Resources\r\n\r\n<div align=\"center\">\r\n  <table>\r\n    <tr>\r\n      <td align=\"center\">\r\n        <a href=\"https://docs.flixora.com/airxpay/backend\">\r\n          <img src=\"https://img.shields.io/badge/Documentation-📘-blue?style=for-the-badge\" alt=\"Docs\" />\r\n        </a>\r\n      </td>\r\n      <td align=\"center\">\r\n        <a href=\"https://discord.gg/flixora\">\r\n          <img src=\"https://img.shields.io/badge/Discord-💬-5865F2?style=for-the-badge&logo=discord\" alt=\"Discord\" />\r\n        </a>\r\n      </td>\r\n      <td align=\"center\">\r\n        <a href=\"mailto:support@flixora.com\">\r\n          <img src=\"https://img.shields.io/badge/Email-📧-EA4335?style=for-the-badge&logo=gmail\" alt=\"Email\" />\r\n        </a>\r\n      </td>\r\n    </tr>\r\n  </table>\r\n  \r\n  <br/>\r\n  \r\n  <table>\r\n    <tr>\r\n      <td align=\"center\">\r\n        <a href=\"https://github.com/flixora/airxpay-express-example\">\r\n          <img src=\"https://img.shields.io/badge/Express-Example-000000?style=for-the-badge&logo=express\" alt=\"Express Example\" />\r\n        </a>\r\n      </td>\r\n      <td align=\"center\">\r\n        <a href=\"https://github.com/flixora/airxpay-nestjs-example\">\r\n          <img src=\"https://img.shields.io/badge/NestJS-Example-E0234E?style=for-the-badge&logo=nestjs\" alt=\"NestJS Example\" />\r\n        </a>\r\n      </td>\r\n      <td align=\"center\">\r\n        <a href=\"https://github.com/flixora/airxpay-microservice-example\">\r\n          <img src=\"https://img.shields.io/badge/Microservice-Example-FF6B6B?style=for-the-badge&logo=microgenetics\" alt=\"Microservice Example\" />\r\n        </a>\r\n      </td>\r\n    </tr>\r\n  </table>\r\n</div>\r\n\r\n---\r\n\r\n## 🤝 Contributing\r\n\r\nWe welcome contributions! Please see our [Contributing Guidelines](CONTRIBUTING.md) for details.\r\n\r\n1. Fork the repository\r\n2. Create your feature branch (`git checkout -b feature/amazing-feature`)\r\n3. Commit your changes (`git commit -m 'Add amazing feature'`)\r\n4. Push to the branch (`git push origin feature/amazing-feature`)\r\n5. Open a Pull Request\r\n\r\n---\r\n\r\n## 📈 Backend Roadmap\r\n\r\n- [x] v1.0.0 - Core merchant onboarding\r\n- [x] v1.0.8 - Multi-tenant isolation\r\n- [x] v1.1.0 - Express middleware\r\n- [x] v1.1.5 - NestJS module\r\n- [x] v1.2.0 - Webhook support\r\n- [ ] v1.3.0 - Advanced caching\r\n- [ ] v1.4.0 - GraphQL support\r\n- [ ] v1.5.0 - gRPC support\r\n- [ ] v2.0.0 - Real-time streaming\r\n\r\n---\r\n\r\n## ⚖️ License\r\n\r\n<div align=\"center\">\r\n  <strong>MIT License © 2026 Flixora Technologies</strong>\r\n  <br/>\r\n  <sub>Permission is hereby granted, free of charge, to any person obtaining a copy</sub>\r\n  <br/>\r\n  <sub>of this software and associated documentation files...</sub>\r\n</div>\r\n\r\n---\r\n\r\n## ❤️ Built With Vision\r\n\r\n<div align=\"center\">\r\n  <p>\r\n    <strong>Designed for startups.</strong><br/>\r\n    <strong>Engineered for enterprise.</strong><br/>\r\n    <strong>Future-proof for SaaS scale.</strong>\r\n  </p>\r\n  \r\n  <p>\r\n    <sub>Made with ❤️ by the Flixora Team</sub>\r\n  </p>\r\n  \r\n  <p>\r\n    <sub>Specifically optimized for backend integration | Node.js | Express | NestJS</sub>\r\n  </p>\r\n  \r\n  <p>\r\n    <a href=\"#-airxpay-flixora-sdk---backend-integration\">⬆️ Back to Top</a>\r\n  </p>\r\n</div>","readmeFilename":"README.md"}