{"_id":"@afrinet/sdk","name":"@afrinet/sdk","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"@afrinet/sdk","version":"0.1.0","description":"Official Afrinet Node.js SDK for charges, payouts, and reversals","license":"MIT","type":"module","main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"engines":{"node":">=18"},"scripts":{"build":"tsc -p tsconfig.json","test":"npm run build && node --test tests/**/*.test.js","prepublishOnly":"npm run build"},"keywords":["afrinet","payments","mpesa","fintech","sdk"],"publishConfig":{"registry":"https://registry.npmjs.org","access":"public"},"devDependencies":{"@types/node":"^20","typescript":"^5"},"_id":"@afrinet/sdk@0.1.0","gitHead":"e9e7ed024027772a7b4038ca895172de525e6e97","_nodeVersion":"22.22.3","_npmVersion":"10.9.8","dist":{"integrity":"sha512-D8AQoDQpITP34DHqF/dnCcYM4wnpfoYIA3PYzkklkxWk7UOiUnBtpiCfD1x1GoM44NKt8VgRTdEM9YCvg+4j1g==","shasum":"83b2e6e6905bfcfff9b16aaaf4a42f0f51bc6793","tarball":"https://registry.npmjs.org/@afrinet/sdk/-/sdk-0.1.0.tgz","fileCount":38,"unpackedSize":41175,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIBMetKeXoAh2mjzpOZT4BOmNYuEinoxwE1WNJaZpGfyFAiAtEgtQKmAW+OMLY8CTZ7mxk7yEGlzyXti9UaOxjjsu+A=="}]},"_npmUser":{"name":"afrinet-ops","email":"ops@afrinetglobal.com"},"directories":{},"maintainers":[{"name":"ekiru-t","email":"ekiru@afrinetglobal.com"},{"name":"afrinet-ops","email":"ops@afrinetglobal.com"},{"name":"keith_onyango","email":"keith.onyango@afrinetglobal.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/sdk_0.1.0_1783003597972_0.6141402240462812"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-02T14:46:37.736Z","0.1.0":"2026-07-02T14:46:38.108Z","modified":"2026-07-02T14:46:38.326Z"},"maintainers":[{"name":"ekiru-t","email":"ekiru@afrinetglobal.com"},{"name":"afrinet-ops","email":"ops@afrinetglobal.com"},{"name":"keith_onyango","email":"keith.onyango@afrinetglobal.com"}],"description":"Official Afrinet Node.js SDK for charges, payouts, and reversals","keywords":["afrinet","payments","mpesa","fintech","sdk"],"license":"MIT","readme":"# @afrinet/sdk\n\nOfficial Node.js SDK for the Afrinet Transaction Engine.\n\nServer-side only. Never expose `apiSecret` in browsers or mobile clients.\n\n## Install\n\n```bash\nnpm install @afrinet/sdk\n```\n\n## Quick start\n\n```typescript\nimport Afrinet from \"@afrinet/sdk\";\n\nconst afrinet = new Afrinet({\n  apiKey: process.env.AFRINET_API_KEY!,\n  apiSecret: process.env.AFRINET_API_SECRET!,\n  merchantId: process.env.AFRINET_MERCHANT_ID!,\n  environment: \"sandbox\", // or \"production\"\n});\n\n// M-Pesa charge\nconst charge = await afrinet.charges.create({\n  reference: \"INV-API-001\",\n  description: \"Order payment\",\n  amount: { currency: \"KES\", value: 1500 },\n  paymentMethod: {\n    paymentType: \"mpesa\",\n    details: { type: \"c2b\", phoneNumber: \"254712345678\" },\n  },\n});\n\n// Card charge\nawait afrinet.charges.create({\n  reference: \"INV-CARD-001\",\n  description: \"Card checkout\",\n  amount: { currency: \"KES\", value: 1500 },\n  paymentMethod: {\n    paymentType: \"card\",\n    details: {\n      mode: \"HOSTED_CHECKOUT\",\n      returnUrl: \"https://merchant.example.com/return\",\n      cancelUrl: \"https://merchant.example.com/cancel\",\n    },\n  },\n});\n\n// M-Pesa payout\nawait afrinet.payouts.create({\n  reference: \"PO-API-001\",\n  description: \"Vendor payout\",\n  recipient: [{\n    amount: { currency: \"KES\", value: 500 },\n    paymentMethod: {\n      paymentType: \"mpesa\",\n      details: {\n        type: \"b2c\",\n        phoneNumber: \"254712345678\",\n        commandId: \"BusinessPayment\",\n      },\n    },\n  }],\n});\n\n// Reversal\nawait afrinet.reversals.create({\n  transactionCode: \"04LCM000001\",\n  reason: \"Customer refund\",\n});\n```\n\n## Configuration\n\n| Option | Required | Default |\n|--------|----------|---------|\n| `apiKey` | Yes | — |\n| `apiSecret` | Yes | — |\n| `merchantId` | Yes | — |\n| `environment` | No | `sandbox` |\n| `baseUrl` | No | env base URL |\n| `timeout` | No | `30000` ms |\n| `maxNetworkRetries` | No | `2` |\n\n## Security\n\n- Requests are signed with HMAC-SHA256 (`X-Afrinet-Signature`)\n- Secrets are never logged by the SDK (`sanitizeForLogging` helper included)\n- Browser usage is blocked at initialization\n\n## Errors\n\n```typescript\nimport {\n  AfrinetAuthenticationError,\n  AfrinetInvalidRequestError,\n  AfrinetApiError,\n} from \"@afrinet/sdk\";\n\ntry {\n  await afrinet.charges.create({ ... });\n} catch (error) {\n  if (error instanceof AfrinetAuthenticationError) {\n    // invalid key or signature\n  }\n}\n```\n\n## Development\n\n```bash\nnpm install\nnpm test\nnpm run build\n```","readmeFilename":"README.md","_rev":"1-2aad686b00b37372323094e3360993ce"}