{"id":22897746,"url":"https://github.com/newtonmunene99/mpesa-api","last_synced_at":"2025-04-07T16:19:19.828Z","repository":{"id":34092612,"uuid":"137644301","full_name":"newtonmunene99/mpesa-api","owner":"newtonmunene99","description":"A NodeJs Module to help you with M-Pesa Daraja API calls.","archived":false,"fork":false,"pushed_at":"2023-03-04T02:42:50.000Z","size":990,"stargazers_count":103,"open_issues_count":17,"forks_count":50,"subscribers_count":13,"default_branch":"master","last_synced_at":"2024-04-14T03:54:15.728Z","etag":null,"topics":["money","mpesa","mpesa-api","mpesa-payments","mpesa-rest","mpesa-sdk","mpesapi","online-payment-system","online-payments","safaricom","safaricom-api","safaricom-daraja-nodejs","safaricom-mpesa","safaricom-mpesa-apis"],"latest_commit_sha":null,"homepage":"http://npmjs.com/package/mpesa-api","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/newtonmunene99.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":["newtonmunene99"],"patreon":"newtonmunene","open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"custom":null}},"created_at":"2018-06-17T09:47:47.000Z","updated_at":"2024-06-19T17:11:02.569Z","dependencies_parsed_at":"2024-06-19T17:10:56.780Z","dependency_job_id":"72cb087d-657a-4e3c-9c28-974949ff8733","html_url":"https://github.com/newtonmunene99/mpesa-api","commit_stats":{"total_commits":106,"total_committers":8,"mean_commits":13.25,"dds":"0.10377358490566035","last_synced_commit":"efa4b76b5dcf124a4c7f8ddac0ca371ae496926d"},"previous_names":[],"tags_count":7,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/newtonmunene99%2Fmpesa-api","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/newtonmunene99%2Fmpesa-api/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/newtonmunene99%2Fmpesa-api/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/newtonmunene99%2Fmpesa-api/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/newtonmunene99","download_url":"https://codeload.github.com/newtonmunene99/mpesa-api/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247685634,"owners_count":20979085,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["money","mpesa","mpesa-api","mpesa-payments","mpesa-rest","mpesa-sdk","mpesapi","online-payment-system","online-payments","safaricom","safaricom-api","safaricom-daraja-nodejs","safaricom-mpesa","safaricom-mpesa-apis"],"created_at":"2024-12-14T00:18:57.193Z","updated_at":"2025-04-07T16:19:19.793Z","avatar_url":"https://github.com/newtonmunene99.png","language":"TypeScript","funding_links":["https://github.com/sponsors/newtonmunene99","https://patreon.com/newtonmunene"],"categories":[],"sub_categories":[],"readme":"# Mpesa-Api\n\n**⚠️⚠️⚠️⚠️⚠️**\n\n**The official daraja API and its documentation has recently changed significantly, some links and functionality may be outdated. Due to other obligations, I'm unable to actively maintain the package. Looking for contributors/maintainers who can help write tests and keep everything updated.**\n\n**⚠️⚠️⚠️⚠️⚠️**\n\n---\n\n:zap: :bomb: :fire: :fire: :bomb: :zap:\n\nAn NPM Module built with NodeJs in mind to help you with M-Pesa Daraja API calls.\n\nPlease note that this module is intended for use in a node environment on the backend and will raise a few issues if used on the client side/browser environment. This is mainly due to the file system.\n\n|          | Badge                                                                                                                               |\n| -------- | ----------------------------------------------------------------------------------------------------------------------------------- |\n| Travis   | [![Build Status](https://travis-ci.org/newtonmunene99/mpesa-api.svg?branch=master)](https://travis-ci.org/newtonmunene99/mpesa-api) |\n| Latest   | [![Latest](https://badgen.net/npm/v/mpesa-api)](https://www.npmjs.com/package/mpesa-api)                                            |\n| Minified | [![Minified Size](https://badgen.net/bundlephobia/min/mpesa-api)](https://bundlephobia.com/result?p=mpesa-api)                      |\n| MinZip   | [![Min](https://badgen.net/bundlephobia/minzip/mpesa-api)](https://bundlephobia.com/result?p=mpesa-api)                             |\n\nReady Methods\n\n- [x] [B2B](#business-to-business) - **DEPRECATED**\n- [x] [C2B](#c2b)\n- [x] [B2C](#business-to-customer-b2c)\n- [x] [TRANSACTION STATUS](#transaction-status)\n- [x] [ACCOUNT BALANCE](#account-balance)\n- [x] [REVERSAL](#reversal)\n- [x] [LIPA NA MPESA STK PUSH](#lipa-na-mpesa-online)\n- [x] [LIPA NA MPESA QUERY](#lipa-na-mpesa-online-query)\n\n## Prerequisites\n\n1.  Node 6+.\n2.  NPM(comes with Node) or Yarn.\n\n## Installation\n\nMpesa-Api uses Node Package Manager\n\n```\nnpm i mpesa-api\n```\n\nOr Yarn\n\n```\nyarn add mpesa-api\n```\n\n## Requisites\n\nYou Will need a few things from Safaricom before development.\n\n1.  Consumer Key\n2.  Consumer Secret\n3.  Test Credentials for Development/Sanbox environment\n4.  [Callback server with Mpesa apis whitelisted](#ip-whitelisting) \n- Login or Register as a Safaricom developer [here](https://developer.safaricom.co.ke/login-register) if you haven't.\n- Add a new App [here](https://developer.safaricom.co.ke/user/me/apps)\n- You will be issued with a Consumer Key and Consumer Secret. You will use these to initiate an Mpesa Instance.\n- Obtain Test Credentials [here](https://developer.safaricom.co.ke/test_credentials).\n  - The Test Credentials Obtained Are only valid in Sandbox/Development environment. Take note of them.\n  - To run in Production Environment you will need real Credentials.\n    - To go Live and be issued with real credentials,please refer to [this guide](https://developer.safaricom.co.ke/docs?javascript#going-live)\n\n## Getting Started\n\n```javascript\n// import package\nimport { Mpesa } from \"mpesa-api\";\n//OR\nconst Mpesa = require(\"mpesa-api\").Mpesa;\n\n// create a new instance of the api\nconst mpesa = new Mpesa(credentials, environment);\n```\n\nA moment to explain the above. `credentials` should be an object containing key,secret,initiator password, security credential and certificate path as the properties/keys.\n\n```javascript\n//example\nconst credentials = {\n    clientKey: 'YOUR_CONSUMER_KEY_HERE',\n    clientSecret: 'YOUR_CONSUMER_SECRET_HERE',\n    initiatorPassword: 'YOUR_INITIATOR_PASSWORD_HERE',\n    securityCredential: 'YOUR_SECURITY_CREDENTIAL',\n    certificatePath: 'keys/example.cert'\n};\n// For the initiator_password, use the security credential from the test credentials page.link :https://developer.safaricom.co.ke/test_credentials\n\n// security credential is optional. Set this if you're getting Initiator Name is invalid errors. You can generate your security credential on the test credentials page for sandbox environment or from your mpesa web portal for production environment.\n\n// certificate path is otional. I've provided ceritificates for sandbox and production by default. If you choose not to include it Pass it as null. If you have passed `securityCredential` you should pass `certificatePath` as `null`\nconst credentials = {\n    ...,\n    certificatePath: null\n};\n```\n\n\u003e You can get initiator password from Your Portal(production) or from test credentials(Sandbox). It will be the `Security Credential (Shortcode 1)`.\n\u003e You can generate your security credential on the [test credentials](https://developer.safaricom.co.ke/test_credentials) page for sandbox environment or from your mpesa web portal for production environment. See [this](https://developer.safaricom.co.ke/docs#step-by-step-go-live-guide) guide for production environment(last step on the go live guide).\n\nEnvironment should be a string. It can be either 'production' or 'sandbox'\n\n```javascript\nconst environment = \"sandbox\";\n//or\nconst environment = \"production\";\n```\n\n## Methods and Api Calls\n\n#### Business to Business\n\n\u003e This Has Been Disabled as of January 2019 and I have therefore removed it for now.\n\nThis API enables Business to Business (B2B) transactions between a business and another business. Use of this API requires a valid and verified B2B M-Pesa short code for the business initiating the transaction and the both businesses involved in the transaction.\n\n```javascript\nmpesa\n  .b2b({\n    InitiatorName: \"Initiator Name\",\n    Amount: 1000 /* 1000 is an example amount */,\n    PartyA: \"Party A\",\n    PartyB: \"Party B\",\n    AccountReference: \"Account Reference\",\n    QueueTimeOutURL: \"Queue Timeout URL\",\n    ResultURL: \"Result URL\",\n    CommandID: \"Command ID\" /* OPTIONAL */,\n    SenderIdentifierType: 4 /* OPTIONAL */,\n    RecieverIdentifierType: 4 /* OPTIONAL */,\n    Remarks: \"Remarks\" /* OPTIONAL */,\n  })\n  .then((response) =\u003e {\n    //Do something with the response\n    //eg\n    console.log(response);\n  })\n  .catch((error) =\u003e {\n    //Do something with the error;\n    //eg\n    console.error(error);\n  });\n```\n\n1.  Initiator - This is the credential/username used to authenticate the transaction request.\n2.  CommandID - Unique command for each transaction type, default is `MerchantToMerchantTransfer` possible values are: `BusinessPayBill`, `MerchantToMerchantTransfer`, `MerchantTransferFromMerchantToWorking`, `MerchantServicesMMFAccountTransfer`, `AgencyFloatAdvance`\n3.  Amount - The amount being transacted.\n4.  PartyA - Organization’s short code initiating the transaction.\n5.  SenderIdentifier - Type of organization sending the transaction. Deault is 4\n6.  PartyB - Organization’s short code receiving the funds being transacted.\n7.  RecieverIdentifierType - Type of organization receiving the funds being transacted. Default is 4\n8.  Remarks - Comments that are sent along with the transaction.\n9.  QueueTimeOutURL - The path that stores information of time out transactions.it should be properly validated to make sure that it contains the port, URI and domain name or publicly available IP.\n10. ResultURL - The path that receives results from M-Pesa it should be properly validated to make sure that it contains the port, URI and domain name or publicly available IP.\n11. AccountReference - Account Reference mandatory for “BusinessPaybill” CommandID.\n\n#### Business to Customer (B2C)\n\nThis API enables Business to Customer (B2C) transactions between a company and customers who are the end-users of its products or services. Use of this API requires a valid and verified B2C M-Pesa Short code.\n\n```javascript\nmpesa\n  .b2c({\n    Initiator: \"Initiator Name\",\n    Amount: 1000 /* 1000 is an example amount */,\n    PartyA: \"Party A\",\n    PartyB: \"Party B\",\n    QueueTimeOutURL: \"Queue Timeout URL\",\n    ResultURL: \"Result URL\",\n    CommandID: \"Command ID\" /* OPTIONAL */,\n    Occasion: \"Occasion\" /* OPTIONAL */,\n    Remarks: \"Remarks\" /* OPTIONAL */,\n  })\n  .then((response) =\u003e {\n    //Do something with the response\n    //eg\n    console.log(response);\n  })\n  .catch((error) =\u003e {\n    //Do something with the error;\n    //eg\n    console.error(error);\n  });\n```\n\n1.  Initiator - This is the credential/username used to authenticate the transaction request.\n2.  CommandID - Unique command for each transaction type e.g. SalaryPayment, BusinessPayment, PromotionPayment\n3.  Amount - The amount being transacted\n4.  PartyA - Organization’s shortcode initiating the transaction.\n5.  PartyB - Phone number receiving the transaction\n6.  Remarks - Comments that are sent along with the transaction.\n7.  QueueTimeOutURL - The timeout end-point that receives a timeout response.\n8.  ResultURL - The end-point that receives the response of the transaction\n9.  Occasion - Optional\n\n#### C2B\n\nThis API enables Paybill and Buy Goods merchants to integrate to M-Pesa and receive real time payments notifications.\n\n##### Register\n\nThe C2B Register URL API registers the 3rd party’s confirmation and validation URLs to M-Pesa ; which then maps these URLs to the 3rd party shortcode. Whenever M-Pesa receives a transaction on the shortcode, M-Pesa triggers a validation request against the validation URL and the 3rd party system responds to M-Pesa with a validation response (either a success or an error code). The response expected is the success code the 3rd party\n\nM-Pesa completes or cancels the transaction depending on the validation response it receives from the 3rd party system. A confirmation request of the transaction is then sent by M-Pesa through the confirmation URL back to the 3rd party which then should respond with a success acknowledging the confirmation.\n\n```javascript\nmpesa\n  .c2bregister({\n    ShortCode: \"Short Code\",\n    ConfirmationURL: \"Confirmation URL\",\n    ValidationURL: \"Validation URL\",\n    ResponseType: \"Response Type\",\n  })\n  .then((response) =\u003e {\n    //Do something with the response\n    //eg\n    console.log(response);\n  })\n  .catch((error) =\u003e {\n    //Do something with the error;\n    //eg\n    console.error(error);\n  });\n```\n\n1.  ShortCode - The short code of the organization.\n2.  ResponseType - Default response type for timeout.\n3.  ConfirmationURL- Confirmation URL for the client.\n4.  ValidationURL - Validation URL for the client.\n\n##### Simulate\n\n```javascript\nmpesa\n  .c2bsimulate({\n    ShortCode: 123456,\n    Amount: 1000 /* 1000 is an example amount */,\n    Msisdn: 254792123456,\n    CommandID: \"Command ID\" /* OPTIONAL */,\n    BillRefNumber: \"Bill Reference Number\" /* OPTIONAL */,\n  })\n  .then((response) =\u003e {\n    //Do something with the response\n    //eg\n    console.log(response);\n  })\n  .catch((error) =\u003e {\n    //Do something with the error;\n    //eg\n    console.error(error);\n  });\n```\n\n1.  ShortCode - 6 digit M-Pesa Till Number or PayBill Number\n2.  CommandID - Unique command for each transaction type. Default is `CustomerPayBillOnline`\n3.  Amount - The amount been transacted.\n4.  MSISDN - MSISDN (phone number) sending the transaction, start with country code without the plus(+) sign.\n5.  BillRefNumber - Bill Reference Number (Optional).\n\n#### Account Balance\n\nThe Account Balance API requests for the account balance of a shortcode.\n\n```javascript\nmpesa\n  .accountBalance({\n    Initiator: \"Initiator Name\",\n    PartyA: \"Party A\",\n    IdentifierType: \"Identifier Type\",\n    QueueTimeOutURL: \"Queue Timeout URL\",\n    ResultURL: \"Result URL\",\n    CommandID: \"Command ID\" /* OPTIONAL */,\n    Remarks: \"Remarks\" /* OPTIONAL */,\n  })\n  .then((response) =\u003e {\n    //Do something with the response\n    //eg\n    console.log(response);\n  })\n  .catch((error) =\u003e {\n    //Do something with the error;\n    //eg\n    console.error(error);\n  });\n```\n\n1.  Initiator - This is the credential/username used to authenticate the transaction request.\n2.  CommandID - A unique command passed to the M-Pesa system. Default is `AccountBalance`\n3.  PartyB - The shortcode of the organisation receiving the transaction.\n4.  ReceiverIdentifierType - Type of the organisation receiving the transaction.\n5.  Remarks - Comments that are sent along with the transaction.\n6.  QueueTimeOutURL - The timeout end-point that receives a timeout message.\n7.  ResultURL - The end-point that receives a successful transaction.\n\n#### Transaction Status\n\nTransaction Status API checks the status of a B2B, B2C and C2B APIs transactions.\n\n```javascript\nmpesa\n  .transactionStatus({\n    Initiator: \"Initiator\",\n    TransactionID: \"Transaction ID\",\n    PartyA: \"Party A\",\n    IdentifierType: \"Identifier Type\",\n    ResultURL: \"Result URL\",\n    QueueTimeOutURL: \"Queue Timeout URL\",\n    CommandID: \"Command ID\" /* OPTIONAL */,\n    Remarks: \"Remarks\" /* OPTIONAL */,\n    Occasion: \"Occasion\" /* OPTIONAL */,\n  })\n  .then((response) =\u003e {\n    //Do something with the response\n    //eg\n    console.log(response);\n  })\n  .catch((error) =\u003e {\n    //Do something with the error;\n    //eg\n    console.error(error);\n  });\n```\n\n1.  Initiator - The name of Initiator to initiating the request.\n2.  CommandID - Unique command for each transaction type, possible values are: `TransactionStatusQuery`.\n3.  TransactionID - Organization Receiving the funds.\n4.  Party A - Organization /MSISDN sending the transaction.\n5.  IdentifierType - Type of organization receiving the transaction.\n6.  ResultURL - The path that stores information of transaction.\n7.  QueueTimeOutURL - The path that stores information of time out transaction.\n8.  Remarks - Comments that are sent along with the transaction.\n9.  Occasion - Optional.\n\n#### Lipa na mpesa online\n\nLipa na M-Pesa Online Payment API is used to initiate a M-Pesa transaction on behalf of a customer using STK Push. This is the same technique mySafaricom App uses whenever the app is used to make payments.\n\n```javascript\nmpesa\n  .lipaNaMpesaOnline({\n    BusinessShortCode: 123456,\n    Amount: 1000 /* 1000 is an example amount */,\n    PartyA: \"Party A\",\n    PhoneNumber: \"Phone Number\",\n    CallBackURL: \"CallBack URL\",\n    AccountReference: \"Account Reference\",\n    passKey: \"Lipa Na Mpesa Pass Key\",\n    TransactionType: \"Transaction Type\" /* OPTIONAL */,\n    TransactionDesc: \"Transaction Description\" /* OPTIONAL */,\n  })\n  .then((response) =\u003e {\n    //Do something with the response\n    //eg\n    console.log(response);\n  })\n  .catch((error) =\u003e {\n    //Do something with the error;\n    //eg\n    console.error(error);\n  });\n```\n\n1.  BusinessShortCode - The organization shortcode used to receive the transaction.\n2.  Amount - The amount to be transacted.\n3.  PartyA - The MSISDN sending the funds.\n4.  PartyB - The organization shortcode receiving the funds. Default is the BusinessShorCode.\n5.  PhoneNumber - The MSISDN sending the funds.\n6.  CallBackURL - The url to where responses from M-Pesa will be sent to.\n7.  AccountReference - Used with M-Pesa PayBills.\n8.  TransactionDesc - A description of the transaction.\n9.  passKey - Lipa Na Mpesa Pass Key.\n10. Transaction Type - Default is `CustomerPayBillOnline`\n\n#### Lipa na mpesa online query\n\n```javascript\nmpesa\n  .lipaNaMpesaQuery({\n    BusinessShortCode: 123456,\n    CheckoutRequestID: \"Checkout Request ID\",\n    passKey: \"Lipa Na Mpesa Pass Key\",\n  })\n  .then((response) =\u003e {\n    //Do something with the response\n    //eg\n    console.log(response);\n  })\n  .catch((error) =\u003e {\n    //Do something with the error;\n    //eg\n    console.error(error);\n  });\n```\n\n1.  BusinessShortCode - Business Short Code\n2.  CheckoutRequestID - Checkout RequestID\n3.  Lipa Na Mpesa Pass Key\n\n#### Reversal\n\nReverses a B2B, B2C or C2B M-Pesa transaction.\n\n```javascript\nmpesa\n  .reversal({\n    Initiator: \"Initiator\",\n    TransactionID: \"Transaction ID\",\n    Amount: 1000 /* 1000 is an example amount */,\n    ReceiverParty: \"Reciever Party\",\n    ResultURL: \"Result URL\",\n    QueueTimeOutURL: \"Queue Timeout URL\",\n    CommandID: \"Command ID\" /* OPTIONAL */,\n    RecieverIdentifierType: 11 /* OPTIONAL */,\n    Remarks: \"Remarks\" /* OPTIONAL */,\n    Occasion: \"Ocassion\" /* OPTIONAL */,\n  })\n  .then((response) =\u003e {\n    //Do something with the response\n    //eg\n    console.log(response);\n  })\n  .catch((error) =\u003e {\n    //Do something with the error;\n    //eg\n    console.error(error);\n  });\n```\n\n1.  Initiator - This is the credential/username used to authenticate the transaction request.\n2.  TransactionID - Organization Receiving the funds.\n3.  Amount - The Amount To Be Reversed\n4.  PartyA - Organization/MSISDN sending the transaction.\n5.  RecieverIdentifierType - Type of organization receiving the transaction. Default is `11`\n6.  ResultURL - The path that stores information of transaction.\n7.  QueueTimeOutURL - The path that stores information of time out transaction.\n8.  Remarks - Comments that are sent along with the transaction.\n9.  Occasion - Optional.\n10. Command ID - Default is `TransactionReversal`\n\n\n## IP Whitelisting\n\nYou might need to whitelist Mpesa IPs listed below on the server/firewall that receives the callbacks.\n\n\u003cdetails\u003e\n  \u003csummary\u003eView List\u003c/summary\u003e\n\n- 196.201.214.200\n- 196.201.214.206\n- 196.201.213.114\n- 196.201.214.207\n- 196.201.214.208\n- 196.201.213.44\n- 196.201.212.127\n- 196.201.212.128\n- 196.201.212.129\n- 196.201.212.132\n- 196.201.212.136\n- 196.201.212.138\n\n\u003c/details\u003e\n\n\n## Demo\n\nYou can try it out on [Runkit](https://runkit.com/newtonmunene99/mpesa-api-demo)\n\n## RoadMap\n\n- [x] Basic Documentation\n- [x] Deploy to Npm\n- [x] Migrate to Typescript\n- [x] Detailed Documentation\n- [ ] Write Tests\n- [x] Validators for inputs\n- [ ] Tree shaking\n- [ ] Migrate from Typescript to JSDoc\n\n## Build\n\nIf you Wish to build\n\n1. Clone this repo\n2. CD into repo\n3. run `npm install` to install dependencies\n4. run `npm run build` to build\n5. run `npm run start:dev` to run package in development mode\n\n## Contributing\n\n1. Fork the project then clone the forked project\n2. Create your feature branch: `git checkout -b my-new-feature`\n3. Make your changes and add name to Contributors list below.\n4. Commit your changes: `git commit -m 'Add some feature'`\n5. Push to the branch: `git push origin my-new-feature`\n6. Submit a pull request.\n\n## Credits\n\n| Name                                               | Role        |\n| -------------------------------------------------- | ----------- |\n| [Newton Munene](https://github.com/newtonmunene99) | Contributor |\n| [Nelson Bwogora](https://github.com/nelsonBlack)   | Contributor |\n\n## License\n\nMIT License\n\nCopyright (c) 2018 Newton Munene\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnewtonmunene99%2Fmpesa-api","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnewtonmunene99%2Fmpesa-api","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnewtonmunene99%2Fmpesa-api/lists"}