{
"info": {
"author": "Flutterwave",
"author_email": "developers@flutterwavego.com",
"bugtrack_url": null,
"classifiers": [
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
"Programming Language :: Python :: 3"
],
"description": "# Rave_Python\n\n## Introduction\nThis is a Python wrapper around the [API](https://flutterwavedevelopers.readme.io/v2.0/reference) for [Rave by Flutterwave](https://rave.flutterwave.com).\n#### Payment types implemented:\n* Card Payments\n* Bank Account Payments\n* Ghana Mobile Money Payments\n* Mpesa Payments\n* Uganda Mobile Money Payments\n* Zambia Mobile Money Payments\n* Mobile Money Payments for Francophone countries\n* Subaccounts\n* Transfer\n* Subscription (Recurring Payments)\n* Payment Plan\n* USSD Payments (Still In Beta Mode)\n## Installation\nTo install, run\n\n``` pip install rave_python```\n\nNote: This is currently under active development\n## Import Package\nThe base class for this package is 'Rave'. To use this class, add:\n\n``` from rave_python import Rave ```\n\n## Initialization\n\n#### To instantiate in sandbox:\nTo use Rave, instantiate the Rave class with your public key. We recommend that you store your secret key in an environment variable named, ```RAVE_SECRET_KEY```. Instantiating your rave object is therefore as simple as:\n\n``` rave = Rave(\"YOUR_PUBLIC_KEY\")```\n\n#### To instantiate without environment variables (Sandbox):\nIf you choose not to store your secret key in an environment variable, we do provide a ```usingEnv``` flag which can be set to ```False```, but please be warned, do not use this package without environment variables in production\n\n``` rave = Rave(\"YOUR_PUBLIC_KEY\", \"YOUR_SECRET_KEY\", usingEnv = False) ```\n\n\n#### To instantiate in production:\nTo initialize in production, simply set the ```production``` flag to ```True```. It is highly discouraged but if you choose to not use environment variables, you can do so in the same way mentioned above.\n\n``` rave = Rave(\"YOUR_PUBLIC_KEY\", production=True)```\n\n# Rave Objects\nThis is the documentation for all of the components of rave_python\n\n## ```rave.Card```\nThis is used to facilitate card transactions.\n\n**Functions included:**\n\n* ```.charge```\n\n* ```.validate```\n\n* ```.verify```\n\n* ```.getTypeOfArgsRequired```\n\n* ```.updatePayload```\n\n
\n\n### ```.charge(payload)```\nThis is called to start a card transaction. The payload should be a dictionary containing card information. It should have the parameters:\n\n* ```cardno```,\n\n* ```cvv```, \n\n* ```currency```, \n\n* ```country```, \n\n* ```expirymonth```, \n\n* ```expiryyear```, \n\n* ```amount```, \n\n* ```email```, \n\n* ```phonenumber```,\n\n* ```firstname```, \n\n* ```lastname```, \n\n* ```IP```\n\nOptionally, you can add a custom transaction reference using the ```txRef``` parameter. Note that if you do not specify one, it would be automatically generated. We do provide a function for generating transaction references in the Misc library (add link).\n\n\nA sample call is:\n\n``` res = rave.Card.charge(payload) ```\n\n#### Returns\n\nThis call returns a dictionary. A sample response is:\n\n ```{'validationRequired': True, 'suggestedAuth': u'PIN', 'flwRef': None, 'authUrl': None, 'error': False, 'txRef': 'MC-1538095398058'} ```\n\n This call raises an ```CardChargeError``` if there was a problem processing your transaction. The ```CardChargeError``` contains some information about your transaction. You can handle this as such:\n\n```\ntry: \n #Your charge call\nexcept RaveExceptions.CardChargeError as e:\n print(e.err[\"errMsg\"])\n print(e.err[\"flwRef\"])\n```\n\nA sample ``` e.err ``` contains:\n\n```{'error': True, 'txRef': 'MC-1530897824739', 'flwRef': None, 'errMsg': 'Sorry, that card number is invalid, please check and try again'}```\n\n\n
\n\n### ```rave.Misc.updatePayload(authMethod, payload, arg)```\n\nDepending on the suggestedAuth from the charge call, you may need to update the payload with a pin or address. To know which type of authentication you would require, simply call ```rave.Card.getTypeOfArgsRequired(suggestedAuth)```. This returns either ```pin``` or ```address```. \n\nIn the case of ```pin```, you are required to call ```rave.Card.updatePayload(suggestedAuth, payload, pin=\"THE_CUSTOMER_PIN\")```. \n\nIn the case of ```address```, you are required to call ```rave.Card.updatePayload(suggestedAuth, payload, address={ THE_ADDRESS_DICTIONARY })```\n\nA typical address dictionary includes the following parameters:\n\n```billingzip```, \n\n```billingcity```,\n\n```billingaddress```, \n\n```billingstate```,\n\n```billingcountry```\n\n**Note:**\n```suggestedAuth``` is the suggestedAuth returned from the initial charge call and ```payload``` is the original payload\n\n
\n\n### ```.validate(txRef)```\n\nAfter a successful charge, most times you will be asked to verify with OTP. To check if this is required, check the ```validationRequired``` key in the ```res``` of the charge call.\n\nTo validate, you need to pass the ```flwRef``` from the ```res``` of the charge call as well as the OTP.\n\nA sample validate call is: \n\n```res2 = rave.Card.validate(res[\"flwRef\"], \"12345\")```\n\n#### Returns\n\nThis call returns a dictionary containing the ```txRef```, ```flwRef``` among others if successful. \n\nThis call raises a ```TransactionValidationError``` if the OTP is not correct or there was a problem processing your request. \n\nTo handle this, write:\n\n```\ntry:\n # Your charge call\nexcept RaveExceptions.TransactionValidationError as e:\n print(e.err[\"errMsg\"])\n print(e.err[\"flwRef\"])\n```\n\nA sample ``` e.err ``` contains:\n\n```{'error': True, 'txRef': None, 'flwRef': 'FLW-MOCK-a7911408bd7f55f89f0211819d6fd370', 'errMsg': 'otp is required'}```\n\n
\n\n### ```.verify(txRef)```\n\nYou can call this to check if your transaction was completed successfully. You have to pass the transaction reference generated at the point of charging. This is the ```txRef``` in the ```res``` parameter returned any of the calls (```charge``` or ```validate```). \n\nA sample verify call is:\n\n``` res = rave.Card.verify(data[\"txRef\"]) ```\n\n#### Returns\n\nThis call returns a dict with ```txRef```, ```flwRef``` and ```transactionComplete``` which indicates whether the transaction was completed successfully. \n\nSample\n```{'flwRef': None, 'cardToken': u'flw-t1nf-5b0f12d565cd961f73c51370b1340f1f-m03k', 'chargedAmount': 100, 'amount': 100, 'transactionComplete': True, 'error': False, 'txRef': u'MC-1538095718251'}```\n\n#### Please note that after charging a card successfully on rave, if you wish to save the card for further charges, In your verify payment response you will find an object: \"cardtoken\": \"flw-t0-f6f915f53a094671d98560272572993e-m03k\". This is the token you will use for card tokenization. Details are provided below.\n\nIf your call could not be completed successfully, a ```TransactionVerificationError``` is raised.\n\n
\n\n### ```.charge(payload_for_saved_card, chargeWithToken=True)```\nThis is called to start a card transaction with a card that has been saved. The payload should be a dictionary containing card information. It should have the parameters:\n\n* ```token```,\n\n* ```country```, \n\n* ```amount```, \n\n* ```email```, \n\n* ```firstname```, \n\n* ```lastname```, \n\n* ```IP```,\n\n* ```txRef```, \n\n* ```currency```\n\n#### NB: email must be the same as before the card was saved\nOptionally, you can add a custom transaction reference using the ```txRef``` parameter. Note that if you do not specify one, it would be automatically generated. We do provide a function for generating transaction references in the Misc library (add link).\n\nA sample call is:\n\n``` res = rave.Card.charge(payload_for_saved_card, chargeWithToken=True) ```\n\n#### Returns\n\nThis call returns a dictionary. A sample response is:\n\n ```{'status': u'success', 'validationRequired': False, 'suggestedAuth': None, 'flwRef': u'FLW-M03K-cdb24d740fb18c242dd277fb1f74d399', 'authUrl': None, 'error': False, 'txRef': 'MC-7666-YU'}```\n\n This call raises a ```CardChargeError``` if a wrong token or email is passed or if there was a problem processing your transaction. The ```CardChargeError``` contains some information about your transaction. You can handle this as such:\n\n ```\ntry: \n #Your charge call\nexcept RaveExceptions.CardChargeError as e:\n print(e.err[\"errMsg\"])\n print(e.err[\"flwRef\"])\n```\n\nThis call also raises an ```IncompletePaymentDetailsError``` if any of the required parameters are missing. The ```IncompletePaymentDetailsError``` contains information about which parameter was not included in the payload. You can handle this such as:\n\n```\ntry:\n #Your charge call\nexcept RaveExceptions.IncompletePaymentDetailsError as e:\n print(e.err[\"errMsg\"])\n```\n\nOnce this is done, call ```rave.Card.verify``` passing in the ```txRef``` returned in the response to verify the payment. Sample response:\n\n```{'flwRef': None, 'cardToken': u'flw-t1nf-5b0f12d565cd961f73c51370b1340f1f-m03k', 'chargedAmount': 1000, 'amount': 1000, 'transactionComplete': True, 'error': False, 'txRef': 'MC-7666-YU'}```\n\n```rave.Card.verify``` raises a ```TransactionVerificationError``` if an invalid ```txRef`` is supplied. You can handle this as such:\n\n ```\ntry: \n #Your charge call\nexcept RaveExceptions.CardChargeError as e:\n print(e.err[\"errMsg\"])\n print(e.err[\"flwRef\"])\n```\n#### NB: when charging saved cards, you do not need to call rave.card.Validate()\n\n### Complete card charge flow\n\n```\n\nfrom rave_python import Rave\nrave = Rave(\"YOUR_PUBLIC_KEY\", \"YOUR_SECRET_KEY\", usingEnv = False)\n\n# Payload with pin\npayload = {\n \"cardno\": \"5438898014560229\",\n \"cvv\": \"890\",\n \"expirymonth\": \"09\",\n \"expiryyear\": \"19\",\n \"amount\": \"10\",\n \"email\": \"user@gmail.com\",\n \"phonenumber\": \"0902620185\",\n \"firstname\": \"temi\",\n \"lastname\": \"desola\",\n \"IP\": \"355426087298442\",\n}\n\ntry:\n res = rave.Card.charge(payload)\n\n if res[\"suggestedAuth\"]:\n arg = Misc.getTypeOfArgsRequired(res[\"suggestedAuth\"])\n\n if arg == \"pin\":\n Misc.updatePayload(res[\"suggestedAuth\"], payload, pin=\"3310\")\n if arg == \"address\":\n Misc.updatePayload(res[\"suggestedAuth\"], payload, address= {\"billingzip\": \"07205\", \"billingcity\": \"Hillside\", \"billingaddress\": \"470 Mundet PI\", \"billingstate\": \"NJ\", \"billingcountry\": \"US\"})\n\n res = rave.Card.charge(payload)\n\n if res[\"validationRequired\"]:\n rave.Card.validate(res[\"flwRef\"], \"\")\n\n res = rave.Card.verify(res[\"txRef\"])\n print(res[\"transactionComplete\"])\n\nexcept RaveExceptions.CardChargeError as e:\n print(e.err[\"errMsg\"])\n print(e.err[\"flwRef\"])\n\nexcept RaveExceptions.TransactionValidationError as e:\n print(e.err)\n print(e.err[\"flwRef\"])\n\nexcept RaveExceptions.TransactionVerificationError as e:\n print(e.err[\"errMsg\"])\n print(e.err[\"txRef\"])\n\n```\n
\n## ```rave.Account```\nThis is used to facilitate account transactions.\n\n**Functions included:**\n\n* ```.charge```\n\n* ```.validate```\n\n* ```.verify```\n\n
\n\n### ```.charge(payload)```\nThis is called to start an account transaction. The payload should be a dictionary containing card information. It should have the parameters:\n\n* ```accountbank```, \n\n* ```accountnumber```, \n\n* ```amount```, \n\n* ```email```, \n\n* ```phonenumber```, \n\n* ```IP```\n\nOptionally, you can add a custom transaction reference using the ```txRef``` parameter. Note that if you do not specify one, it would be automatically generated. We do provide a function for generating transaction references in the Misc library (add link).\n\n\nA sample call is:\n\n``` res = rave.Account.charge(payload) ```\n\n#### Returns\n\nThis call returns a dictionary. A sample response is:\n\n ```{'error': False, 'validationRequired': True, 'txRef': 'MC-1530899106006', 'flwRef': 'ACHG-1530899109682', 'authUrl': None} ```\n\n This call raises an ```AccountChargeError``` if there was a problem processing your transaction. The ```AccountChargeError``` contains some information about your transaction. You can handle this as such:\n\n```\ntry: \n #Your charge call\nexcept RaveExceptions.AccountChargeError as e:\n print(e.err[\"errMsg\"])\n print(e.err[\"flwRef\"])\n```\n\nA sample ``` e.err ``` contains:\n\n```{'error': True, 'txRef': 'MC-1530897824739', 'flwRef': None, 'errMsg': 'Sorry, that account number is invalid, please check and try again'}```\n\n
\n\n### ```.validate(txRef)```\n\nAfter a successful charge, most times you will be asked to verify with OTP. To check if this is required, check the ```validationRequired``` key in the ```res``` of the charge call.\n\nIn the case that an ```authUrl``` is returned from your charge call, you may skip the validation step and simply pass your authUrl to the end-user. \n\n```authUrl = res['authUrl'] ```\n\nTo validate, you need to pass the ```flwRef``` from the ```res``` of the charge call as well as the OTP.\n\nA sample validate call is: \n\n```res2 = rave.Account.validate(res[\"flwRef\"], \"12345\")```\n\n\n#### Returns\n\nThis call returns a dictionary containing the ```txRef```, ```flwRef``` among others if successful.\n\nThis call raises a ```TransactionValidationError``` if the OTP is not correct or there was a problem processing your request. \n\nTo handle this, write:\n\n```\ntry:\n # Your charge call\nexcept RaveExceptions.TransactionValidationError as e:\n print(e.err[\"errMsg\"])\n print(e.err[\"flwRef\"])\n```\n\nA sample ``` e.err ``` contains:\n\n```{'error': True, 'txRef': 'MC-1530899869968', 'flwRef': 'ACHG-1530899873118', 'errMsg': 'Pending OTP validation'}```\n\n\n\n
\n\n### ```.verify(txRef)```\n\nYou can call this to check if your transaction was completed successfully. You have to pass the transaction reference generated at the point of charging. This is the ```txRef``` in the ```res``` parameter returned any of the calls (```charge``` or ```validate```). \n\nA sample verify call is:\n\n``` res = rave.Account.verify(data[\"txRef\"]) ```\n\n#### Returns\n\nThis call returns a dict with ```txRef```, ```flwRef``` and ```transactionComplete``` which indicates whether the transaction was completed successfully. \n\nSample\n\n```{'status': u'success', 'vbvcode': u'N/A', 'chargedamount': 500, 'vbvmessage': u'N/A', 'error': False, 'flwRef': u'ACHG-1538093023787', 'currency': u'NGN', 'amount': 500, 'transactionComplete': True, 'acctmessage': u'Approved Or Completed Successfully', 'chargecode': u'00', 'txRef': u'MC-1538093008498'}```\n\nIf your call could not be completed successfully or if a wrong ```txRef``` is passed, a ```TransactionVerificationError``` is raised. You can handle that as such\n```\ntry: \n #Your charge call\nexcept RaveExceptions.TransactionVerificationError as e:\n print(e.err[\"errMsg\"])\n print(e.err[\"flwRef\"])\n```\n\n\n\n
\n\n### Complete account flow\n\n```\nfrom rave_python import Rave, RaveExceptions, Misc\nrave = Rave(\"ENTER_YOUR_PUBLIC_KEY\", \"ENTER_YOUR_SECRET_KEY\", usingEnv = False)\n# account payload\npayload = {\n \"accountbank\": \"044\", # get the bank code from the bank list endpoint.\n \"accountnumber\": \"0690000031\",\n \"currency\": \"NGN\",\n \"country\": \"NG\",\n \"amount\": \"100\",\n \"email\": \"test@test.com\",\n \"phonenumber\": \"0902620185\",\n \"IP\": \"355426087298442\",\n}\n\ntry:\n res = rave.Account.charge(payload)\n if res[\"authUrl\"]:\n print(res[\"authUrl\"])\n\n elif res[\"validationRequired\"]:\n rave.Account.validate(res[\"flwRef\"], \"12345\")\n\n res = rave.Account.verify(res[\"txRef\"])\n print(res)\n\nexcept RaveExceptions.AccountChargeError as e:\n print(e.err)\n print(e.err[\"flwRef\"])\n\nexcept RaveExceptions.TransactionValidationError as e:\n print(e.err)\n print(e.err[\"flwRef\"])\n\nexcept RaveExceptions.TransactionVerificationError as e:\n print(e.err[\"errMsg\"])\n print(e.err[\"txRef\"])\n\n\n```\n
\n\n## ```rave.GhMobile```\nThis is used to facilitate Ghanaian mobile money transactions.\n\n**Functions included:**\n\n* ```.charge```\n\n\n* ```.verify```\n\n
\n\n### ```.charge(payload)```\nThis is called to start an Ghana mobile money transaction. The payload should be a dictionary containing account information. It should have the parameters:\n\n* ```amount```,\n\n* ```email```, \n\n* ```phonenumber```,\n\n* ```network```,\n\n* ```IP```,\n\n* ```redirect_url```\n\nOptionally, you can add a custom transaction reference using the ```txRef``` parameter. Note that if you do not specify one, it would be automatically generated. We do provide a function for generating transaction references in the Misc library (add link).\n\n\nA sample call is:\n\n``` res = rave.GhMobile.charge(payload) ```\n\n#### Returns\n\nThis call returns a dictionary. A sample response is:\n\n ```{'error': False, 'validationRequired': True, 'txRef': 'MC-1530910216380', 'flwRef': 'N/A'} ```\n\n This call raises an ```TransactionChargeError``` if there was a problem processing your transaction. The ```TransactionChargeError``` contains some information about your transaction. You can handle this as such:\n\n```\ntry: \n #Your charge call\nexcept RaveExceptions.TransactionChargeError as e:\n print(e.err[\"errMsg\"])\n print(e.err[\"flwRef\"])\n\n```\n\nA sample ``` e.err ``` contains:\n\n```{'error': True, 'txRef': 'MC-1530911537060', 'flwRef': None, 'errMsg': None}```\n\n\n
\n\n### ```.verify(txRef)```\n\nYou can call this to check if your transaction was completed successfully. You have to pass the transaction reference generated at the point of charging. This is the ```txRef``` in the ```res``` parameter returned any of the calls (```charge``` or ```validate```). \n\nA sample verify call is:\n\n``` res = rave.GhMobile.verify(data[\"txRef\"]) ```\n\n#### Returns\n\nThis call returns a dict with ```txRef```, ```flwRef``` and ```transactionComplete``` which indicates whether the transaction was completed successfully. \n\nIf your call could not be completed successfully, a ```TransactionVerificationError``` is raised.\n\n
\n\n### Complete GhMobile charge flow\n\n```\nfrom rave_python import Rave, RaveExceptions, Misc\nrave = Rave(\"ENTER_YOUR_PUBLIC_KEY\", \"ENTER_YOUR_SECRET_KEY\", usingEnv = False)\n\n# mobile payload\npayload = {\n \"amount\": \"50\",\n \"email\": \"\",\n \"phonenumber\": \"054709929220\",\n \"network\": \"MTN\",\n \"redirect_url\": \"https://rave-webhook.herokuapp.com/receivepayment\",\n \"IP\":\"\"\n}\n\ntry:\n res = rave.GhMobile.charge(payload)\n res = rave.GhMobile.verify(res[\"txRef\"])\n print(res)\n\nexcept RaveExceptions.TransactionChargeError as e:\n print(e.err)\n print(e.err[\"flwRef\"])\n\nexcept RaveExceptions.TransactionVerificationError as e:\n print(e.err[\"errMsg\"])\n print(e.err[\"txRef\"])\n\n\n```\n
\n\n## ```rave.Mpesa```\nThis is used to facilitate Mpesa transactions.\n\n**Functions included:**\n\n* ```.charge```\n\n\n* ```.verify```\n\n
\n\n### ```.charge(payload)```\nThis is called to start an Mpesa transaction. The payload should be a dictionary containing account information. It should have the parameters:\n\n* ```account```, \n\n* ```email```, \n\n* ```phonenumber```, \n\n* ```IP```\n\nOptionally, you can add a custom transaction reference using the ```txRef``` parameter. Note that if you do not specify one, it would be automatically generated. We do provide a function for generating transaction references in the Misc library (add link).\n\n\nA sample call is:\n\n``` res = rave.Mpesa.charge(payload) ```\n\n#### Returns\n\nThis call returns a dictionary. A sample response is:\n\n ```{'error': False, 'validationRequired': True, 'txRef': 'MC-1530910216380', 'flwRef': 'N/A'} ```\n\n This call raises an ```TransactionChargeError``` if there was a problem processing your transaction. The ```TransactionChargeError``` contains some information about your transaction. You can handle this as such:\n\n```\ntry: \n #Your charge call\nexcept RaveExceptions.TransactionChargeError as e:\n print(e.err[\"errMsg\"])\n print(e.err[\"flwRef\"])\n\n```\n\nA sample ``` e.err ``` contains:\n\n```{'error': True, 'txRef': 'MC-1530910109929', 'flwRef': None, 'errMsg': 'email is required'}```\n\n\n
\n\n### ```.verify(txRef)```\n\nYou can call this to check if your transaction was completed successfully. You have to pass the transaction reference generated at the point of charging. This is the ```txRef``` in the ```res``` parameter returned any of the calls (```charge``` or ```validate```). \n\nA sample verify call is:\n\n``` res = rave.Mpesa.verify(data[\"txRef\"]) ```\n\n#### Returns\n\nThis call returns a dict with ```txRef```, ```flwRef``` and ```transactionComplete``` which indicates whether the transaction was completed successfully. \n\nIf your call could not be completed successfully, a ```TransactionVerificationError``` is raised.\n\n
\n\n### Complete Mpesa charge flow\n\n```\nfrom rave_python import Rave, RaveExceptions, Misc\nrave = Rave(\"ENTIRE_YOUR_PUBLIC_KEY\", \"ENTIRE_YOUR_SECRET_KEY\", usingEnv = False)\n\n# mobile payload\npayload = {\n \"amount\": \"100\",\n \"phonenumber\": \"0926420185\",\n \"email\": \"user@exampe.com\",\n \"IP\": \"40.14.290\",\n \"narration\": \"funds payment\",\n}\n\ntry:\n res = rave.Mpesa.charge(payload)\n res = rave.Mpesa.verify(res[\"txRef\"])\n print(res)\n\nexcept RaveExceptions.TransactionChargeError as e:\n print(e.err[\"errMsg\"])\n print(e.err[\"flwRef\"])\n\nexcept RaveExceptions.TransactionVerificationError as e:\n print(e.err[\"errMsg\"])\n print(e.err[\"txRef\"])\n\n\n```\n
\n\n## ```rave.UGMobile```\nThis is used to facilitate Uganda mobile money transactions.\n\n**Functions included:**\n\n* ```.charge```\n\n\n* ```.verify```\n\n
\n\n### ```.charge(payload)```\nThis is called to start a Ugandan mobile money transaction. The payload should be a dictionary containing account information. It should have the parameters:\n\n* ```amount```,\n\n* ```email```, \n\n* ```phonenumber```,\n\n* ```IP```,\n\n* ```redirect_url```\n\nOptionally, you can add a custom transaction reference using the ```txRef``` parameter. Note that if you do not specify one, it would be automatically generated. We do provide a function for generating transaction references in the Misc library (add link).\n\n\nA sample call is:\n\n``` res = rave.UGMobile.charge(payload) ```\n\n#### Returns\n\nThis call returns a dictionary. A sample response is:\n\n ```{'error': False, 'status': 'success', 'validationRequired': True, 'txRef': 'MC-1544013787279', 'flwRef': 'flwm3s4m0c1544013788481'}```\n\n This call raises an ```TransactionChargeError``` if there was a problem processing your transaction. The ```TransactionChargeError``` contains some information about your transaction. You can handle this as such:\n\n```\ntry: \n #Your charge call\nexcept RaveExceptions.TransactionChargeError as e:\n print(e.err[\"errMsg\"])\n print(e.err[\"flwRef\"])\n\n```\n\nA sample ``` e.err ``` contains:\n\n```{'error': True, 'txRef': 'MC-1530911537060', 'flwRef': None, 'errMsg': None}```\n\n\n
\n\n### ```.verify(txRef)```\n\nYou can call this to check if your transaction was completed successfully. You have to pass the transaction reference generated at the point of charging. This is the ```txRef``` in the ```res``` parameter returned any of the calls (```charge``` or ```validate```). \n\nA sample verify call is:\n\n``` res = rave.UGMobile.verify(data[\"txRef\"]) ```\n\n#### Returns\n\nThis call returns a dict with ```txRef```, ```flwRef``` and ```transactionComplete``` which indicates whether the transaction was completed successfully. \n\nIf your call could not be completed successfully, a ```TransactionVerificationError``` is raised.\n\n
\n\n### Complete UGMobile charge flow\n\n```\nfrom rave_python import Rave, RaveExceptions, Misc\nrave = Rave(\"ENTER_YOUR_PUBLIC_KEY\", \"ENTER_YOUR_SECRET_KEY\", usingEnv = False)\n\n# mobile payload\npayload = {\n \"amount\": \"50\",\n \"email\": \"\",\n \"phonenumber\": \"xxxxxxxx\",\n \"redirect_url\": \"https://rave-webhook.herokuapp.com/receivepayment\",\n \"IP\":\"\"\n}\n\ntry:\n res = rave.UGMobile.charge(payload)\n res = rave.UGMobile.verify(res[\"txRef\"])\n print(res)\n\nexcept RaveExceptions.TransactionChargeError as e:\n print(e.err)\n print(e.err[\"flwRef\"])\n\nexcept RaveExceptions.TransactionVerificationError as e:\n print(e.err[\"errMsg\"])\n print(e.err[\"txRef\"])\n\n\n```\n
\n\n## ```rave.ZBMobile```\nThis is used to facilitate Zambian mobile money transactions.\n\n**Functions included:**\n\n* ```.charge```\n\n\n* ```.verify```\n\n
\n\n### ```.charge(payload)```\nThis is called to start an Zambian mobile money transaction. The payload should be a dictionary containing account information. It should have the parameters:\n\n* ```amount```,\n\n* ```email```, \n\n* ```phonenumber```,\n\n* ```IP```,\n\n* ```redirect_url```\n\nOptionally, you can add a custom transaction reference using the ```txRef``` parameter. Note that if you do not specify one, it would be automatically generated. We do provide a function for generating transaction references in the Misc library (add link).\n\n\nA sample call is:\n\n``` res = rave.ZBMobile.charge(payload) ```\n\n#### Returns\n\nThis call returns a dictionary. A sample response is:\n\n ```{'error': False, 'status': 'success', 'validationRequired': True, 'txRef': 'MC-1544013787279', 'flwRef': 'flwm3s4m0c1544013788481'}```\n\n This call raises an ```TransactionChargeError``` if there was a problem processing your transaction. The ```TransactionChargeError``` contains some information about your transaction. You can handle this as such:\n\n```\ntry: \n #Your charge call\nexcept RaveExceptions.TransactionChargeError as e:\n print(e.err[\"errMsg\"])\n print(e.err[\"flwRef\"])\n\n```\n\nA sample ``` e.err ``` contains:\n\n```{'error': True, 'txRef': 'MC-1530911537060', 'flwRef': None, 'errMsg': None}```\n\n\n
\n\n### ```.verify(txRef)```\n\nYou can call this to check if your transaction was completed successfully. You have to pass the transaction reference generated at the point of charging. This is the ```txRef``` in the ```res``` parameter returned any of the calls (```charge``` or ```validate```). \n\nA sample verify call is:\n\n``` res = rave.ZBMobile.verify(data[\"txRef\"]) ```\n\n#### Returns\n\nThis call returns a dict with ```txRef```, ```flwRef``` and ```transactionComplete``` which indicates whether the transaction was completed successfully. \n\nIf your call could not be completed successfully, a ```TransactionVerificationError``` is raised.\n\n
\n\n### Complete ZBMobile charge flow\n\n```\nfrom rave_python import Rave, RaveExceptions, Misc\nrave = Rave(\"ENTER_YOUR_PUBLIC_KEY\", \"ENTER_YOUR_SECRET_KEY\", usingEnv = False)\n\n# mobile payload\npayload = {\n \"amount\": \"50\",\n \"email\": \"\",\n \"phonenumber\": \"xxxxxxxx\",\n \"redirect_url\": \"https://rave-webhook.herokuapp.com/receivepayment\",\n \"IP\":\"\"\n}\n\ntry:\n res = rave.ZBMobile.charge(payload)\n res = rave.ZBMobile.verify(res[\"txRef\"])\n print(res)\n\nexcept RaveExceptions.TransactionChargeError as e:\n print(e.err)\n print(e.err[\"flwRef\"])\n\nexcept RaveExceptions.TransactionVerificationError as e:\n print(e.err[\"errMsg\"])\n print(e.err[\"txRef\"])\n\n\n```\n
\n\n## ```rave.Francophone```\nThis is used to facilitate mobile money transactions in Ivory Coast, Senegal and Mali.\n\n**Functions included:**\n\n* ```.charge```\n\n\n* ```.verify```\n\n
\n\n### ```.charge(payload)```\nThis is called to start a francophone mobile money transaction. The payload should be a dictionary containing account information. It should have the parameters:\n\n* ```amount```,\n\n* ```email```, \n\n* ```phonenumber```,\n\n* ```IP```,\n\n* ```redirect_url```\n\nOptionally, you can add a custom transaction reference using the ```txRef``` parameter. Note that if you do not specify one, it would be automatically generated. We do provide a function for generating transaction references in the Misc library (add link).\n\n\nA sample call is:\n\n``` res = rave.Francophone.charge(payload) ```\n\n#### Returns\n\nThis call returns a dictionary. A sample response is:\n\n ```{'error': False, 'validationRequired': True, 'txRef': 'MC-1566482674756', 'flwRef': None, 'suggestedAuth': None, 'redirectUrl': 'https://flutterwaveprodv2.com/flwcinetpay/paymentServlet?reference=FLW186321566482674310'} ```\n\n The call returns redirect Url ```'redirectUrl':'https://redirecturl.com'``` for the authentication of the transaction. It raises an ```TransactionChargeError``` if there was a problem processing your transaction. The ```TransactionChargeError``` contains some information about your transaction. You can handle this as such:\n\n```\ntry: \n #Your charge call\nexcept RaveExceptions.TransactionChargeError as e:\n print(e.err[\"errMsg\"])\n print(e.err[\"flwRef\"])\n\n```\n\nA sample ``` e.err ``` contains:\n\n```{'error': True, 'txRef': 'MC-1530911537060', 'flwRef': None, 'errMsg': None}```\n\n\n
\n\n### ```.verify(txRef)```\n\nYou can call this to check if your transaction was completed successfully. You have to pass the transaction reference generated at the point of charging. This is the ```txRef``` in the ```res``` parameter returned any of the calls (```charge``` or ```validate```). \n\nA sample verify call is:\n\n``` res = rave.Francophone.verify(data[\"txRef\"]) ```\n\n#### Returns\n\nThis call returns a dict with ```txRef```, ```flwRef``` and ```transactionComplete``` which indicates whether the transaction was completed successfully. \n\nIf your call could not be completed successfully, a ```TransactionVerificationError``` is raised.\n\n
\n\n### Complete Francophone mobile money charge flow\n\n```\nfrom rave_python import Rave, RaveExceptions, Misc\nrave = Rave(\"ENTER_YOUR_PUBLIC_KEY\", \"ENTER_YOUR_SECRET_KEY\", usingEnv = False)\n\n# mobile payload\npayload = {\n \"amount\": \"50\",\n \"email\": \"\",\n \"phonenumber\": \"054709929220\",\n \"redirect_url\": \"https://rave-webhook.herokuapp.com/receivepayment\",\n \"IP\":\"\"\n}\n\ntry:\n res = rave.Francophone.charge(payload)\n print(res)\n res = rave.Francophone.verify(res[\"txRef\"])\n print(res)\n\nexcept RaveExceptions.TransactionChargeError as e:\n print(e.err)\n print(e.err[\"flwRef\"])\n\nexcept RaveExceptions.TransactionVerificationError as e:\n print(e.err[\"errMsg\"])\n print(e.err[\"txRef\"])\n\n\n```\n
\n\n## ```rave.Preauth```\nThis is used to facilitate preauthorized card transactions. This inherits the Card class so any task you can do on Card, you can do with preauth.\n\n**Functions included:**\n\n* ```.charge```\n\n* ```.capture```\n\n* ```.validate```\n\n* ```.verify```\n\n* ```.refund```\n\n* ```.void```\n\n\n
\n\n**\nIn order to ```preauthorize``` a card, you must have:\n 1. charged the card initially using ```rave.Card.charge(payload)```\n 2. saved the ```token``` returned to you for that card. A ```token``` looks like this ```flw-t1nf-5b0f12d565cd961f73c51370b1340f1f-m03k```\n**\n\n### ```.charge(cardDetails, chargeWithToken=True, hasFailed=False)```\n\nThis is used to preauthorise a specific amount to be paid by a customer.\n\n**Note:** > it takes the same parameters as Card charge. However, the cardDetails object differs. See below for an example\n\nOnce preauthorised successfully, you can then ```capture``` that ```held``` amount at a later time or date\n\nA sample charge call is:\n\n``` \npayload = {\n \"token\":\"flw-t1nf-5b0f12d565cd961f73c51370b1340f1f-m03k\",\n \"country\":\"NG\",\n \"amount\":1000,\n \"email\":\"user@gmail.com\",\n \"firstname\":\"temi\",\n \"lastname\":\"Oyekole\",\n \"IP\":\"190.233.222.1\",\n \"txRef\":\"MC-7666-YU\",\n \"currency\":\"NGN\"\nrave.Preauth.charge(payload)\n```\n\n#### Returns\n\nThis call returns a dictionary. A sample response is:\n\n ```{'error': False, 'status': 'success', 'validationRequired': False, 'txRef': 'MC-7666-YU', 'flwRef': 'FLW-PREAUTH-M03K-7d01799093ee2db9d8136cf042dc8c37', 'suggestedAuth': None, 'authUrl': None} ```\n\n This call raises an ```TransactionChargeError``` if there was a problem processing your transaction. The ```TransactionChargeError``` contains some information about your transaction. You can handle this as such:\n\n```\ntry: \n #Your charge call\nexcept RaveExceptions.TransactionChargeError as e:\n print(e.err[\"errMsg\"])\n print(e.err[\"flwRef\"])\n```\n\n\n
\n\n\n### ```.capture(flwRef)```\n\nThis is used to capture the funds held in the account. Similar to the validate call, it requires you to pass the ```flwRef``` of the transaction.\n\n>Please **NOTE** that the ```flwRef``` must be gotten from the response of the initial charge i.e after calling ```rave.Preauth.charge(payload)```\n\n\nA sample capture call is:\n\n``` rave.Preauth.capture(data[\"flwRef\"])```\n\n#### Returns\n\nThis call returns a dictionary. A sample response is:\n\n ```{'error': False, 'status': 'success', 'message': 'Capture complete', 'validationRequired': False, 'txRef': 'MC-7666-YU', 'flwRef': 'FLW-PREAUTH-M03K-0bce8fe1c3561e17e026ddfbbea37fdb'} ```\n\n This call raises an ```PreauthCaptureError``` if there was a problem processing your transaction. The ```PreauthCaptureError``` contains some information about your transaction. You can handle this as such:\n\n```\ntry: \n #Your charge call\nexcept RaveExceptions.PreauthCaptureError as e:\n print(e.err[\"errMsg\"])\n print(e.err[\"flwRef\"])\n```\n\n
\n\n### ```.void(flwRef)```\n\nThis is used to void a preauth transaction. Similar to the validate call, it requires you to pass the ```flwRef```. \n\n>Please **NOTE** that the ```flwRef``` must be gotten from the response of the initial charge i.e after calling ```rave.Preauth.charge(payload)```\n\n\n\nA sample void call is:\n\n```rave.Preauth.void(data[\"flwRef\"]) ```\n\n
\n\n### ```.refund(flwRef)```\n\nThis is used to refund a preauth transaction. Similar to the validate call, it requires you to pass the ```flwRef```. \n\n>Please **NOTE** that the ```flwRef``` must be gotten from the response of the initial charge i.e after calling ```rave.Preauth.charge(payload)```\n\n\n\nA sample void call is:\n\n```rave.Preauth.refund(data[\"flwRef\"]) ```\n\n\n### ```.verify(txRef)```\n\n**See rave.Card.verify above**\n\n#### Returns\n\nThis call returns a dictionary. A sample response is:\n\n ```{'error': False, 'transactionComplete': True, 'txRef': 'MC-7666-YU', 'flwRef': None, 'amount': 1000, 'chargedAmount': 1000, 'cardToken': 'flw-t1nf-5b0f12d565cd961f73c51370b1340f1f-m03k'} ```\n\n This call raises an ```TransactionVerificationError``` if there was a problem processing your transaction. The ```TransactionVerificationError``` contains some information about your transaction. You can handle this as such:\n\n```\ntry: \n #Your charge call\nexcept RaveExceptions.TransactionVerificationError as e:\n print(e.err[\"errMsg\"])\n print(e.err[\"flwRef\"])\n```\n\n
\n\n\n### Complete preauth charge flow\n\n```\nfrom rave_python import Rave, Misc, RaveExceptions\nrave = Rave(\"ENTER_YOUR_PUBLIC_KEY\", \"ENTER_YOUR_SECRET_KEY\", usingEnv = False)\n\n# Payload with pin\npayload = {\n \"token\":\"flw-t1nf-5b0f12d565cd961f73c51370b1340f1f-m03k\",\n \"country\":\"NG\",\n \"amount\":1000,\n \"email\":\"user@gmail.com\",\n \"firstname\":\"temi\",\n \"lastname\":\"Oyekole\",\n \"IP\":\"190.233.222.1\",\n \"txRef\":\"MC-7666-YU\",\n \"currency\":\"NGN\",\n}\n\ntry:\n res = rave.Preauth.charge(payload)\n res = rave.Preauth.capture(res[\"flwRef\"])\n res = rave.Preauth.verify(res[\"txRef\"])\n print(res)\n\nexcept RaveExceptions.TransactionChargeError as e:\n print(e)\n print(e.err[\"errMsg\"])\n print(e.err[\"flwRef\"])\n\nexcept RaveExceptions.PreauthCaptureError as e:\n print(e.err[\"errMsg\"])\n print(e.err[\"flwRef\"])\n\nexcept RaveExceptions.TransactionVerificationError as e:\n print(e.err[\"errMsg\"])\n print(e.err[\"txRef\"])\n\n\n```\n\n
\n## ```rave.SubAccount```\n\nThis is used to initiate and manage payouts\n\n\n**Functions included:**\n\n* ```.createSubaccount```\n\n* ```.allSubaccounts```\n\n* ```.fetchSubaccounts```\n\n\n
\n\n### ```.createSubaccount(accountDetails)```\n\nThis allows you to create a subaccount plan. It requires a dict ```accountDetails``` containing ```account_bank```, ```account_number```, ```business_name```, ```business_email```, ```business_contact```, ```business_contact_mobile```, ```business_mobile```.\n\n>account_bank: This is the sub-accounts bank ISO code, use the [List of Banks for Transfer](https://developer.flutterwave.com/reference#list-of-banks-for-transfer) endpoint to retrieve a list of bank codes.\n\n>account_number: This is the customer's account number\n\n>business_name: This is the sub-account business name.\n\n>business_email: This is the sub-account business email.\n\n>business_contact: This is the contact person for the sub-account e.g. Richard Hendrix\n\n>business_contact_mobile: Business contact number.\n\n>business_mobile: Primary business contact number.\n\n>split_type: This can be set as ```percentage``` or ```flat``` when set as percentage it means you want to take a percentage fee on all transactions, and vice versa for flat this means you want to take a flat fee on every transaction.\n\n>split_value: This can be a ```percentage``` value or ```flat``` value depending on what was set on ```split_type```\n\nMore information can be found [here](https://developer.flutterwave.com/v2.0/reference#create-subaccount)\n\n\nA sample createsubAccount call is:\n\n``` \n res = rave.SubAccount.createSubaccount({\n\t\"account_bank\": \"044\",\n\t\"account_number\": \"0690000031\",\n\t\"business_name\": \"Jake Stores\",\n\t\"business_email\": \"kwakj@services.com\",\n\t\"business_contact\": \"Amy Parkers\",\n\t\"business_contact_mobile\": \"09083772\",\n\t\"business_mobile\": \"0188883882\",\n \"split_type\": \"flat\",\n \"split_value\": 3000\n\t\"meta\": [{\"metaname\": \"MarketplaceID\", \"metavalue\": \"ggs-920900\"}]\n})\n```\n\n#### Returns\n\nThis call returns a dictionary. A sample response is:\n\n ```\n {'error': False, 'id': 114, 'data': {'id': 114, 'account_number': '0690000032', 'account_bank': '044', 'business_name': 'Jake Stores', 'fullname': 'Pastor Bright', 'date_created': '2018-10-09T10:43:02.000Z', 'meta': [{'metaname': 'MarketplaceID', 'metavalue': 'ggs-920900'}], 'split_ratio': 1, 'split_type': 'flat', 'split_value': 3000, 'subaccount_id': 'RS_8279B1518A139DD3238328747F322418', 'bank_name': 'ACCESS BANK NIGERIA'}}\n ```\n\n This call raises an ```.SubaccountCreationError``` if there was a problem processing your transaction. The ```.SubaccountCreationError``` contains some information about your transaction. You can handle this as such:\n\n```\ntry: \n #Your charge call\nexcept RaveExceptions..SubaccountCreationError as e:\n print(e.err[\"errMsg\"])\n print(e.err[\"flwRef\"])\n```\n\n### ```.allSubaccounts()```\n\nThis allows you retrieve all subaccounts \n\nA sample allSubaccounts call is:\n\n``` \nres2 = rave.SubAccount.allSubaccounts()\n```\n\n#### Returns\n\nThis call returns a dictionary. A sample response is:\n\n ```\n {'error': False, 'returnedData': {'status': 'success', 'message': 'SUBACCOUNTS', 'data': {'page_info': {'total': 3, 'current_page': 1, 'total_pages': 1}, 'subaccounts': [{'id': 114, 'account_number': '0690000032', 'account_bank': '044', 'business_name': 'Jake Stores', 'fullname': 'Pastor Bright', 'date_created': '2018-10-09T10:43:02.000Z', 'meta': [{'metaname': 'MarketplaceID', 'metavalue': 'ggs-920900'}], 'split_ratio': 1, 'split_type': 'flat', 'split_value': 3000, 'subaccount_id': 'RS_8279B1518A139DD3238328747F322418', 'bank_name': 'ACCESS BANK NIGERIA'}, {'id': 107, 'account_number': '0690000031', 'account_bank': '044', 'business_name': 'Jake Stores', 'fullname': 'Forrest Green', 'date_created': '2018-10-05T18:30:09.000Z', 'meta': [{'metaname': 'MarketplaceID', 'metavalue': 'ggs-920900'}], 'split_ratio': 1, 'split_type': 'flat', 'split_value': 100, 'subaccount_id': 'RS_41FFE616A1FA7EA56C85E57F593056F7', 'bank_name': 'ACCESS BANK NIGERIA'}]}}}\n\n ```\n\n This call raises an ```PlanStatusError``` if there was a problem processing your transaction. The ```PlanStatusError``` contains some information about your transaction. You can handle this as such:\n\n```\ntry: \n #Your charge call\nexcept RaveExceptions.PlanStatusError as e:\n print(e.err[\"errMsg\"])\n print(e.err[\"flwRef\"])\n```\n\n### ```.fetchSubaccount(subaccount_id)```\n\nThis allows you fetch a subaccount. You may or may not pass in a ```subaccount_id```. If you do not pass in a ```subaccount_id``` all subacocunts will be returned.\n\n>subaccount_id: This is the payment plan ID. It can be gotten from the response returned from creating a plan or from the Rave Dashboard\n\n\nA sample fetchSubaccount call is:\n\n``` \nres2 = rave.SubAccount.fetchSubaccount(900)\n```\n\n#### Returns\n\nThis call returns a dictionary. A sample response is:\n\n ```\n {'error': False, 'returnedData': {'status': 'success', 'message': 'SUBACCOUNT', 'data': {'id': 106, 'account_number': '0690000035', 'account_bank': '044', 'business_name': 'JK Services', 'fullname': 'Peter Crouch', 'date_created': '2018-10-05T18:24:21.000Z', 'meta': [{'metaname': 'MarketplaceID', 'metavalue': 'ggs-920900'}], 'split_ratio': 1, 'split_type': 'flat', 'split_value': 100, 'subaccount_id': 'RS_0A6C260E1A70934DE6EF2F8CEE46BBB3', 'bank_name': 'ACCESS BANK NIGERIA'}}}\n ```\n\n This call raises an ```PlanStatusError``` if there was a problem processing your transaction. The ```PlanStatusError``` contains some information about your transaction. You can handle this as such:\n\n```\ntry: \n #Your charge call\nexcept RaveExceptions.PlanStatusError as e:\n print(e.err[\"errMsg\"])\n print(e.err[\"flwRef\"])\n```\n\n### Complete SubAccount flow\n\n```\nfrom rave_python import Rave, Misc, RaveExceptions\nrave = Rave(\"YOUR_PUBLIC_KEY\", \"YOUR_PRIVATE_KEY\", usingEnv = False)\ntry:\n\n res = rave.SubAccount.createSubaccount({\n\t\"account_bank\": \"044\",\n\t\"account_number\": \"0690000032\",\n\t\"business_name\": \"Jake Stores\",\n\t\"business_email\": \"jdhhd@services.com\",\n\t\"business_contact\": \"Amy Parkers\",\n\t\"business_contact_mobile\": \"09083772\",\n\t\"business_mobile\": \"0188883882\",\n \"split_type\": \"flat\",\n \"split_value\": 3000,\n\t\"meta\": [{\"metaname\": \"MarketplaceID\", \"metavalue\": \"ggs-920900\"}]\n })\n res = rave.SubAccount.fetchSubaccount('RS_0A6C260E1A70934DE6EF2F8CEE46BBB3')\n print(res)\n\nexcept RaveExceptions.IncompletePaymentDetailsError as e:\n print(e)\n\nexcept RaveExceptions.PlanStatusError as e:\n print(e.err)\n\nexcept RaveExceptions.ServerError as e:\n print(e.err)\n\n```\n
\n\n## ```rave.Transfer```\n\nThis is used to initiate and manage payouts\n\n\n**Functions included:**\n\n* ```.initiate```\n\n* ```.bulk```\n\n* ```.fetch```\n\n* ```.allTransfers```\n\n* ```.getFee```\n\n* ```.getBalance```\n\n
\n\n### ```.initiate(transferDetails)```\n\nThis initiates a transfer to a customer's account. When a transfer is initiated, it comes with a status NEW this means the transfer has been queued for processing.\n\n**Please note that you must pass ```beneficiary_name``` as part of the initiate call. Else an error will be thrown.**\n>Also if you are doing international transfers, you must pass a meta parameter as part of your payload as shown below:\n```\n\"meta\": [\n {\n \"AccountNumber\": \"09182972BH\",\n \"RoutingNumber\": \"0000000002993\",\n \"SwiftCode\": \"ABJG190\",\n \"BankName\": \"BANK OF AMERICA, N.A., SAN FRANCISCO, CA\",\n \"BeneficiaryName\": \"Mark Cuban\",\n \"BeneficiaryAddress\": \"San Francisco, 4 Newton\",\n \"BeneficiaryCountry\": \"US\"\n }\n]\n```\n\nA sample initiate call is:\n\n``` \nres = rave.Transfer.initiate({\n \"account_bank\": \"044\",\n \"account_number\": \"0690000044\",\n \"amount\": 500,\n \"narration\": \"New transfer\",\n \"currency\": \"NGN\",\n \"beneficiary_name\": \"Kwame Adew\"\n })\nprint(res)\n```\n\n#### Returns\n\nThis call returns a dictionary. A sample response is:\n\n ```\n {'error': False, 'id': 2671, 'data': {'id': 2671, 'account_number': '0690000044', 'bank_code': '044', 'fullname': 'Mercedes Daniel', 'date_created': '2018-10-09T08:37:20.000Z', 'currency': 'NGN', 'amount': 500, 'fee': 45, 'status': 'NEW', 'reference': 'MC-1539074239367', 'meta': None, 'narration': 'New transfer', 'complete_message': '', 'requires_approval': 0, 'is_approved': 1, 'bank_name': 'ACCESS BANK NIGERIA'}} \n ```\n\n This call raises an ```IncompletePaymentDetailsError``` if there was a problem processing your transaction. The ```IncompletePaymentDetailsError``` contains some information about your transaction. You can handle this as such:\n\n```\ntry: \n #Your charge call\nexcept RaveExceptions.IncompletePaymentDetailsError as e:\n print(e.err[\"errMsg\"])\n print(e.err[\"flwRef\"])\n```\n\n### ```.bulk(bulkDetails)```\n\nThis initiates a bulk transfer to the customers specified in the ```bulkDetails``` object. When a transfer is initiated, it comes with a status NEW this means the transfer has been queued for processing.\n\nA sample bulk call is:\n\n``` \nres2 = rave.Transfer.bulk({\n \"title\":\"May Staff Salary\",\n \"bulk_data\":[\n {\n \"Ban\":\"044\",\n \"Account Number\": \"0690000032\",\n \"Amount\":500,\n \"Currency\":\"NGN\",\n \"Narration\":\"Bulk transfer 1\",\n \"reference\": \"mk-82973029\"\n },\n {\n \"Bank\":\"044\",\n \"Account Number\": \"0690000034\",\n \"Amount\":500,\n \"Currency\":\"NGN\",\n \"Narration\":\"Bulk transfer 2\",\n \"reference\": \"mk-283874750\"\n }\n ]\n})\n```\n\n#### Returns\n\nThis call returns a dictionary. A sample response is:\n\n ```\n {'error': False, 'status': 'success', 'message': 'BULK-TRANSFER-CREATED', 'id': 499, 'data': {'id': 499, 'date_created': '2018-10-09T09:13:54.000Z', 'approver': 'N/A'}}\n ```\n\n This call raises an ```InitiateTransferError``` if there was a problem processing your transaction. The ```InitiateTransferError``` contains some information about your transaction. You can handle this as such:\n\n```\ntry: \n #Your charge call\nexcept RaveExceptions.InitiateTransferError as e:\n print(e.err[\"errMsg\"])\n print(e.err[\"flwRef\"])\n```\n\n### ```.fetch(reference=None)```\n\nThis allows you retrieve a single transfer. You may or may not pass in a ```reference```. If you do not pass in a reference, all transfers that have been processed will be returned.\n\nA sample fetch call is:\n\n``` \nres2 = rave.Transfer.fetch(\"mk-82973029\")\n```\n\n#### Returns\n\nThis call returns a dictionary. A sample response is:\n\n ```\n {'error': False, 'returnedData': {'status': 'success', 'message': 'QUERIED-TRANSFERS', 'data': {'page_info': {'total': 0, 'current_page': 0, 'total_pages': 0}, 'transfers': []}}}\n\n ```\n\n This call raises an ```TransferFetchError``` if there was a problem processing your transaction. The ```TransferFetchError``` contains some information about your transaction. You can handle this as such:\n\n```\ntry: \n #Your charge call\nexcept RaveExceptions.TransferFetchError as e:\n print(e.err[\"errMsg\"])\n print(e.err[\"flwRef\"])\n```\n\n### ```.allTransfers()```\n\nThis allows you retrieve all transfers. \n\nA sample allTransfers call is:\n\n``` \nres2 = rave.Transfer.allTransfers(\"\")\n```\n\n#### Returns\n\nThis call returns a dictionary. A sample response is:\n\n ```\n {'error': False, 'returnedData': {'status': 'success', 'message': 'QUERIED-TRANSFERS', 'data': {'page_info': {'total': 19, 'current_page': 1, 'total_pages': 2}, 'transfers': [{'id': 2676, 'account_number': '0690000044', 'bank_code': '044', 'fullname': 'Mercedes Daniel', 'date_created': '2018-10-09T09:37:12.000Z', 'currency': 'NGN', 'debit_currency': None, 'amount': 500, 'fee': 45, 'status': 'PENDING', 'reference': 'MC-1539077832148', 'meta': None, 'narration': 'New transfer', 'approver': None, 'complete_message': '', 'requires_approval': 0, 'is_approved': 1, 'bank_name': 'ACCESS BANK NIGERIA'}, {'id': 2673, 'account_number': '0690000044', 'bank_code': '044', 'fullname': 'Mercedes Daniel', 'date_created': '2018-10-09T09:31:37.000Z', 'currency': 'NGN', 'debit_currency': None, 'amount': 500, 'fee': 45, 'status': 'FAILED', 'reference': 'MC-1539077498173', 'meta': None, 'narration': 'New transfer', 'approver': None, 'complete_message': 'DISBURSE FAILED: Insufficient funds', 'requires_approval': 0, 'is_approved': 1, 'bank_name': 'ACCESS BANK NIGERIA'}, {'id': 2672, 'account_number': '0690000034', 'bank_code': '044', 'fullname': 'Ade Bond', 'date_created': '2018-10-09T09:13:56.000Z', 'currency': 'NGN', 'debit_currency': None, 'amount': 500, 'fee': 45, 'status': 'FAILED', 'reference': None, 'meta': None, 'narration': 'Bulk transfer 2', 'approver': None, 'complete_message': 'DISBURSE FAILED: Insufficient funds', 'requires_approval': 0, 'is_approved': 1, 'bank_name': 'ACCESS BANK NIGERIA'}]}}}\n\n ```\n\n This call raises an ```TransferFetchError``` if there was a problem processing your transaction. The ```TransferFetchError``` contains some information about your transaction. You can handle this as such:\n\n```\ntry: \n #Your charge call\nexcept RaveExceptions.TransferFetchError as e:\n print(e.err[\"errMsg\"])\n print(e.err[\"flwRef\"])\n```\n\n### ```.getFee(currency)```\n\nThis allows you get transfer rates for all Rave supported currencies. You may or may not pass in a ```currency```. If you do not pass in a ```currency```, all Rave supported currencies transfer rates will be returned.\n\nA sample getFee call is:\n\n``` \nres2 = rave.Transfer.getFee(\"EUR\")\n```\n\n#### Returns\n\nThis call returns a dictionary. A sample response is:\n\n ```\n{'error': False, 'returnedData': {'status': 'success', 'message': 'TRANSFER-FEES', 'data': [{'id': 6, 'fee_type': 'value', 'currency': 'EUR', 'fee': 35, 'createdAt': None, 'updatedAt': None, 'deletedAt': None, 'AccountId': 1}]}}\n\n ```\n\n ### ```.getBalance(currency)```\n\nThis allows you get your balance in a specified. You may or may not pass in a ```currency```. If you do not pass in a ```currency```, your balance will be returned in the currency specified in yiur rave account\n\nA sample fetch call is:\n\n``` \nres2 = rave.Transfer.Balance(\"EUR\")\n```\n\n#### Returns\n\nThis call returns a dictionary. A sample response is:\n\n ```\n{'error': False, 'returnedData': {'status': 'success', 'message': 'WALLET-BALANCE', 'data': {'Id': 27122, 'ShortName': 'EUR', 'WalletNumber': '3855000502677', 'AvailableBalance': 0, 'LedgerBalance': 0}}}\n ```\n\n\n
\n\n### Complete transfer flow\n\n```\nfrom rave_python import Rave, RaveExceptions\ntry:\n rave = Rave(\"ENTER_YOUR_PUBLIC_KEY\", \"ENTER_YOUR_SECRET_KEY\", usingEnv = False)\n\n res = rave.Transfer.initiate({\n \"account_bank\": \"044\",\n \"account_number\": \"0690000044\",\n \"amount\": 500,\n \"narration\": \"New transfer\",\n \"currency\": \"NGN\",\n \"beneficiary_name\": \"Kwame Adew\"\n })\n\n res2 = rave.Transfer.bulk({\n \"title\": \"test\",\n \"bulk_data\":[\n ]\n })\n print(res)\n\n balanceres = rave.Transfer.getBalance(\"NGN\")\n print(balanceres)\n\nexcept RaveExceptions.IncompletePaymentDetailsError as e:\n print(e)\n\nexcept RaveExceptions.InitiateTransferError as e:\n print(e.err)\n\nexcept RaveExceptions.TransferFetchError as e:\n print(e.err)\n\nexcept RaveExceptions.ServerError as e:\n print(e.err)\n\n\n```\n
\n\n## ```rave.Subscriptions```\n\nThis is used to initiate and manage payouts\n\n\n**Functions included:**\n\n* ```.allSubscriptions```\n\n* ```.fetchSubscription```\n\n* ```.cancelSubscription```\n\n* ```.activateSubscription```\n\n\n### ```.allSubscriptions()```\n\nThis allows you retrieve all subscriptions \n\nA sample allSubaccounts call is:\n\n``` \nres2 = rave.Subscriptions.allSubscriptions()\n```\n\n#### Returns\n\nThis call returns a dictionary. A sample response is:\n\n ```\n {'error': False, 'returnedData': {'status': 'success', 'message': 'SUBSCRIPTIONS-FETCHED', 'data': {'page_info': {'total': 0, 'current_page': 0, 'total_pages': 0}, 'plansubscriptions': []}}}\n ```\n\n This call raises an ```PlanStatusError``` if there was a problem processing your transaction. The ```PlanStatusError``` contains some information about your transaction. You can handle this as such:\n\n```\ntry: \n #Your charge call\nexcept RaveExceptions.PlanStatusError as e:\n print(e.err[\"errMsg\"])\n print(e.err[\"flwRef\"])\n```\n\n### ```.fetchSubscription(subscription_id, subscription_email)```\n\nThis allows you fetch a subscription. You may or may not pass in a ```subscription_id``` or ```subscription_email```. If you do not pass in a ```subscription_id``` or ```subscription_email``` all subscriptions will be returned.\n\n>subscription_id: This is the subscription ID.\n\n>subscription_email: This is the subscription email.\n\n\nA sample fetchSubaccount call is:\n\n``` \nres2 = rave.Subscriptions.fetchSubscription(900)\n```\n\n#### Returns\n\nThis call returns a dictionary. A sample response is:\n\n ```\n {'error': False, 'returnedData': {'status': 'success', 'message': 'SUBSCRIPTIONS-FETCHED', 'data': {'page_info': {'total': 0, 'current_page': 0, 'total_pages': 0}, 'plansubscriptions': []}}}\n ```\n\n This call raises an ```PlanStatusError``` if there was a problem processing your transaction. The ```PlanStatusError``` contains some information about your transaction. You can handle this as such:\n\n```\ntry: \n #Your charge call\nexcept RaveExceptions.PlanStatusError as e:\n print(e.err[\"errMsg\"])\n print(e.err[\"flwRef\"])\n```\n\n### ```.cancelSubscription(subscription_id)```\n\nThis allows you cancel a subscription.\n\n>subscription_id: This is the subscription ID. It can be gotten from the Rave Dashboard\n\n\nA sample cancelSubscription call is:\n\n``` \nres2 = rave.Subscriptions.cancelSubscription(900)\n```\n\n This call raises an ```PlanStatusError``` if there was a problem processing your transaction. The ```PlanStatusError``` contains some information about your transaction. You can handle this as such:\n\n```\ntry: \n #Your charge call\nexcept RaveExceptions.PlanStatusError as e:\n print(e.err[\"errMsg\"])\n print(e.err[\"flwRef\"])\n```\n\n\n### ```.activateSubscription(subscription_id)```\n\nThis allows you activate a subscription.\n\n>subscription_id: This is the subscription ID. It can be gotten from the Rave Dashboard\n\n\nA sample activateSubscription call is:\n\n``` \nres2 = rave.Subscriptions.activateSubscription(900)\n```\n\n This call raises an ```PlanStatusError``` if there was a problem processing your transaction. The ```PlanStatusError``` contains some information about your transaction. You can handle this as such:\n\n```\ntry: \n #Your charge call\nexcept RaveExceptions.PlanStatusError as e:\n print(e.err[\"errMsg\"])\n print(e.err[\"flwRef\"])\n```\n\n### Complete Subscriptions flow\n\n```\nfrom rave_python import Rave, Misc, RaveExceptions\nrave = Rave(\"YOUR_PUBLIC_KEY\", \"YOUR_PRIVATE_KEY\", usingEnv = False)\ntry:\n\n res = rave.Subscriptions.allSubscriptions()\n res = rave.Subscriptions.fetchSubscription(880)\n res = rave.Subscriptions.cancelSubscription(880)\n print(res)\n\nexcept RaveExceptions.PlanStatusError as e:\n print(e.err)\n\nexcept RaveExceptions.ServerError as e:\n print(e.err)\n\n```\n
\n## ```rave.PaymentPlan```\n\nThis is used to initiate and manage payouts\n\n\n**Functions included:**\n\n* ```.createPlan```\n\n* ```.allPlans```\n\n* ```.fetchPlan```\n\n* ```.cancelPlan```\n\n* ```.editPlan```\n\n
\n\n### ```.createPlan(planDetails)```\n\nThis allows a customer to create a payment plan. It requires a dict ```planDetails``` containing ```amount```, ```,name```, ```interval```, ```,```,```duration```. \n>amount: this is the amount for the plan\n\n>name: This is what would appear on the subscription reminder email\n\n>interval: This are the charge intervals possible values are:\n```\ndaily;\nweekly;\nmonthly;\nyearly;\nquarterly;\nbi-anually;\nevery 2 days;\nevery 90 days;\nevery 5 weeks;\nevery 12 months;\nevery 6 years;\nevery x y (where x is a number and y is the period e.g. every 5 months)\n```\n\n>duration: This is the frequency, it is numeric, e.g. if set to 5 and intervals is set to monthly you would be charged 5 months, and then the subscription stops.\n\nMore information can be found [here](https://developer.flutterwave.com/v2.0/reference#create-payment-plan)\n\n\n**If duration is not passed, any subscribed customer will be charged indefinitely**\n\n\nA sample createPlan call is:\n\n``` \n res = rave.PaymentPlan.createPlan({\n \"amount\": 1,\n \"duration\": 5,\n \"name\": \"Ultimate Play\",\n \"interval\": \"5\"\n })\nprint(res)\n```\n\n#### Returns\n\nThis call returns a dictionary. A sample response is:\n\n ```\n {'error': False, 'id': 890, 'data': {'id': 890, 'name': 'Ultimate Play', 'amount': 1, 'interval': 'dai', 'duration': 5, 'status': 'active', 'currency': 'NGN', 'plan_token': 'rpp_af8ea4d5d785d08f47d8', 'date_created': '2018-10-09T10:03:00.000Z'}}\n ```\n\n This call raises an ```IncompletePaymentDetailsError``` if there was a problem processing your transaction. The ```IncompletePaymentDetailsError``` contains some information about your transaction. You can handle this as such:\n\n```\ntry: \n #Your charge call\nexcept RaveExceptions.IncompletePaymentDetailsError as e:\n print(e.err[\"errMsg\"])\n print(e.err[\"flwRef\"])\n```\n\n### ```.allPlans()```\n\nThis allows you retrieve all payment plans. \n\nA sample allPlans call is:\n\n``` \nres2 = rave.Transfer.allPlans()\n```\n\n#### Returns\n\nThis call returns a dictionary. A sample response is:\n\n ```\n {'error': False, 'returnedData': {'status': 'success', 'message': 'QUERIED-PAYMENTPLANS', 'data': {'page_info': {'total': 12, 'current_page': 1, 'total_pages': 2}, 'paymentplans': [{'id': 890, 'name': 'Ultimate Play', 'amount': 1, 'interval': 'dai', 'duration': 5, 'status': 'active', 'currency': 'NGN', 'plan_token': 'rpp_af8ea4d5d785d08f47d8', 'date_created': '2018-10-09T10:03:00.000Z'}, {'id': 885, 'name': 'N/A', 'amount': 0, 'interval': 'daily', 'duration': 0, 'status': 'cancelled', 'currency': 'NGN', 'plan_token': 'rpp_19c8a7af7a06351fd78b', 'date_created': '2018-10-05T17:16:15.000Z'}]}}}\n\n ```\n\n This call raises an ```PlanStatusError``` if there was a problem processing your transaction. The ```PlanStatusError``` contains some information about your transaction. You can handle this as such:\n\n```\ntry: \n #Your charge call\nexcept RaveExceptions.PlanStatusError as e:\n print(e.err[\"errMsg\"])\n print(e.err[\"flwRef\"])\n```\n\n### ```.fetchPlan(plan_id, plan_name)```\n\nThis allows you fetch a payment plan. You may or may not pass in a ```plan_id``` or ```plan_name```. If you do not pass in a ```plan_id``` or ```plan_name```, all payment plans will be returned.\n\n>plan_id: This is the payment plan ID. It can be gotten from the response returned from creating a plan or from the Rave Dashboard\n\n>plan_name: This is the payment plan name. It can be gotten from the response returned from creating a plan or from the Rave Dashboard\n\nA sample fetchPlan call is:\n\n``` \nres2 = rave.Transfer.fetchPlan(900)\n```\n\n#### Returns\n\nThis call returns a dictionary. A sample response is:\n\n ```\n {'error': False, 'returnedData': {'status': 'success', 'message': 'QUERIED-PAYMENTPLANS', 'data': {'page_info': {'total': 1, 'current_page': 1, 'total_pages': 1}, 'paymentplans': [{'id': 890, 'name': 'Ultimate Play', 'amount': 1, 'interval': 'dai', 'duration': 5, 'status': 'active', 'currency': 'NGN', 'plan_token': 'rpp_af8ea4d5d785d08f47d8', 'date_created': '2018-10-09T10:03:00.000Z'}]}}}\n ```\n\n This call raises an ```PlanStatusError``` if there was a problem processing your transaction. The ```PlanStatusError``` contains some information about your transaction. You can handle this as such:\n\n```\ntry: \n #Your charge call\nexcept RaveExceptions.PlanStatusError as e:\n print(e.err[\"errMsg\"])\n print(e.err[\"flwRef\"])\n```\n\n### ```.cancelPlan(plan_id)```\n\nThis allows you cancel a payment plan. It requires that you pass in an ```plan_id```.\n\n>plan_id: This is the payment plan ID. It can be gotten from the response returned from creating a plan or from the Rave Dashboard\n\nA sample cancelPlan call is:\n\n``` \nres2 = rave.Transfer.cancelPlan(900)\n```\n\n#### Returns\n\nThis call returns a dictionary. A sample response is:\n\n ```\n {'error': False, 'returnedData': {'status': 'success', 'message': 'PLAN-CANCELED', 'data': {'id': 890, 'name': 'Ultimate Play', 'uuid': 'rpp_af8ea4d5d785d08f47d8', 'status': 'cancelled', 'start': None, 'stop': None, 'initial_charge_amount': None, 'currency': 'NGN', 'amount': 1, 'duration': 5, 'interval': 'dai', 'createdAt': '2018-10-09T10:03:00.000Z', 'updatedAt': '2018-10-09T10:17:14.000Z', 'deletedAt': None, 'AccountId': 5949, 'paymentpageId': None}}}\n ```\n\n This call raises an ```PlanStatusError``` if there was a problem processing your transaction. The ```PlanStatusError``` contains some information about your transaction. You can handle this as such:\n\n```\ntry: \n #Your charge call\nexcept RaveExceptions.PlanStatusError as e:\n print(e.err[\"errMsg\"])\n print(e.err[\"flwRef\"])\n```\n\n\n### ```.editPlan(plan_id, newData={})```\n\nThis allows you edit a payment plan. It requires that you pass in an ```plan_id```. If you do not pass in the ```newData``` dict containing the change you want to make to your plan, the plan stays the same.\n\n>plan_id: This is the payment plan ID. It can be gotten from the response returned from creating a plan or from the Rave Dashboard\n\n>newData: A ```dict``` that must contain one or both of: ```name```, ```status``` as properties. \n>```name``` specifies the new name for your payment plan.\n>```status``` : possible values are ```active``` and ```cancelled```\n\nA sample cancelPlan call is:\n\n``` \nres = rave.PaymentPlan.editPlan(880, {\n \"name\": \"Jack's Plan\",\n \"status\": \"active\"\n})\n```\n\n#### Returns\n\nThis call returns a dictionary. A sample response is:\n\n ```\n {'error': False, 'returnedData': {'status': 'success', 'message': 'PLAN-EDITED', 'data': {'id': 880, 'name': \"Jack's Plan\", 'uuid': 'rpp_237e94690d8e7089c07b', 'status': 'active', 'start': None, 'stop': None, 'initial_charge_amount': None, 'currency': 'NGN', 'amount': 1, 'duration': 5, 'interval': 'dai', 'createdAt': '2018-10-05T17:13:16.000Z', 'updatedAt': '2018-10-09T10:25:25.000Z', 'deletedAt': None, 'AccountId': 5949, 'paymentpageId': None}}}\n ```\n\n This call raises an ```PlanStatusError``` if there was a problem processing your transaction. The ```PlanStatusError``` contains some information about your transaction. You can handle this as such:\n\n```\ntry: \n #Your charge call\nexcept RaveExceptions.PlanStatusError as e:\n print(e.err[\"errMsg\"])\n print(e.err[\"flwRef\"])\n```\n\n
\n\n### Complete PaymentPlan flow\n\n```\nfrom rave_python import Rave, Misc, RaveExceptions\nrave = Rave(\"YOUR_PUBLIC_KEY\", \"YOUR_PRIVATE_KEY\", usingEnv = False)\ntry:\n\n res = rave.PaymentPlan.createPlan({\n \"amount\": 1,\n \"duration\": 5,\n \"name\": \"Ultimate Plan\",\n \"interval\": \"dai\"\n })\n\n res = rave.PaymentPlan.editPlan(880, {\n \"name\": \"Jack's Plan\",\n \"status\": \"active\"\n })\n print(res)\n\nexcept RaveExceptions.IncompletePaymentDetailsError as e:\n print(e)\n\nexcept RaveExceptions.TransferFetchError as e:\n print(e.err)\n\nexcept RaveExceptions.ServerError as e:\n print(e.err)\n```\n
\n\n## ```rave.Ussd```\n\n>**NOTE:** This payment option is still in beta mode.\n\n
\n## Run Tests\n\nAll of the SDK's test are written with python's ```unittest``` module. The tests currently test:\n```rave.Account```\n```rave.Card```\n```rave.Transfer```\n```rave.Preauth```\n```rave.Subaccount```\n```rave.Subscriptions```\n```rave.Paymentplan```\n\nThey can be run like so:\n\n```python test.py```\n\n>**NOTE:** If the test fails for creating a subaccount, just change the ```account_number``` ```account_bank``` and ```businesss_email``` to something different\n\n>**NOTE:** The test may fail for account validation - ``` Pending OTP validation``` depending of whether the service is down or not\n\n\n",
"description_content_type": "text/markdown",
"docs_url": null,
"download_url": "",
"downloads": {
"last_day": -1,
"last_month": -1,
"last_week": -1
},
"home_page": "https://github.com/Flutterwave/rave-python",
"keywords": "",
"license": "",
"maintainer": "",
"maintainer_email": "",
"name": "rave-python",
"package_url": "https://pypi.org/project/rave-python/",
"platform": "",
"project_url": "https://pypi.org/project/rave-python/",
"project_urls": {
"Homepage": "https://github.com/Flutterwave/rave-python"
},
"release_url": "https://pypi.org/project/rave-python/1.0.2/",
"requires_dist": [
"pycryptodome",
"requests"
],
"requires_python": "",
"summary": "Official Rave Python Wrapper By Flutterwave",
"version": "1.0.2"
},
"last_serial": 5720301,
"releases": {
"1.0.0": [
{
"comment_text": "",
"digests": {
"md5": "a8a96b35c2dabf17af2b0ebb7efae4eb",
"sha256": "c00021397e1ed1f7e8d57a4fc9bb1707a8735d41f3b44dfcdcf61460b69d032e"
},
"downloads": -1,
"filename": "rave_python-1.0.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "a8a96b35c2dabf17af2b0ebb7efae4eb",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 36565,
"upload_time": "2019-02-21T19:11:31",
"url": "https://files.pythonhosted.org/packages/a4/23/377bc668a289863c3699ecfd31aae5f338a78af5a6476c14ed261aaaea58/rave_python-1.0.0-py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "d24b8c0ff547108b4332069906f2d945",
"sha256": "a8ea71f0b3c8600247e3a9490e00a1e1ebed3a62fbfc402adcacd756c8d9c7d6"
},
"downloads": -1,
"filename": "rave_python-1.0.0.tar.gz",
"has_sig": false,
"md5_digest": "d24b8c0ff547108b4332069906f2d945",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 43935,
"upload_time": "2019-02-21T19:11:34",
"url": "https://files.pythonhosted.org/packages/07/31/ab24a47fcd432aa5ba21fd3f4faca63d39fe50297670b7914c7a9edd6ab5/rave_python-1.0.0.tar.gz"
}
],
"1.0.1": [
{
"comment_text": "",
"digests": {
"md5": "7487aeb63e71e6db90d4b6217405f707",
"sha256": "6c8ee680cce011eb8a806f569997e1a3dbe776736954ff3ba9ff48fe0b9e5414"
},
"downloads": -1,
"filename": "rave_python-1.0.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "7487aeb63e71e6db90d4b6217405f707",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 36640,
"upload_time": "2019-03-13T14:54:44",
"url": "https://files.pythonhosted.org/packages/92/e8/7b3c25f72d9bc3e0d222c4f9767ec5045d93f5ec976755639df3d95b0cb1/rave_python-1.0.1-py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "bae738c51c6fdd88eef8a136487c7e99",
"sha256": "4ca1ea34c40bc924f418211dc3fa236954682f00c0b62755a7f67725387e9f5e"
},
"downloads": -1,
"filename": "rave_python-1.0.1.tar.gz",
"has_sig": false,
"md5_digest": "bae738c51c6fdd88eef8a136487c7e99",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 44012,
"upload_time": "2019-03-13T14:55:04",
"url": "https://files.pythonhosted.org/packages/5e/b7/e9bd72295f0354d3719d2ce8eb444cae10103bd9097eb3be30dbb39a31ad/rave_python-1.0.1.tar.gz"
}
],
"1.0.2": [
{
"comment_text": "",
"digests": {
"md5": "e6c22835ba58e0a4fcb43ee69abca614",
"sha256": "6d54333c39e0ce169b170939ea8f758f6571c435755ca89dafcbc85a7d5a530a"
},
"downloads": -1,
"filename": "rave_python-1.0.2-py3-none-any.whl",
"has_sig": false,
"md5_digest": "e6c22835ba58e0a4fcb43ee69abca614",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 39076,
"upload_time": "2019-08-23T11:39:07",
"url": "https://files.pythonhosted.org/packages/5b/09/2186f4f6184c180531ec8a25100978a0a7452f2e161d23b3eca7fa264bd7/rave_python-1.0.2-py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "803cf95b33e4795c2e343cdc1a5f8b0c",
"sha256": "ccd02f1325ed3b42818d080b1944f7588adb70a1a3322e5dd20a7fccaa2e1232"
},
"downloads": -1,
"filename": "rave_python-1.0.2.tar.gz",
"has_sig": false,
"md5_digest": "803cf95b33e4795c2e343cdc1a5f8b0c",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 44223,
"upload_time": "2019-08-23T11:39:09",
"url": "https://files.pythonhosted.org/packages/ff/37/45a94226a0c238409a8a46050f276cff1df5b51f9f6bbd9d8a56ddeac586/rave_python-1.0.2.tar.gz"
}
]
},
"urls": [
{
"comment_text": "",
"digests": {
"md5": "e6c22835ba58e0a4fcb43ee69abca614",
"sha256": "6d54333c39e0ce169b170939ea8f758f6571c435755ca89dafcbc85a7d5a530a"
},
"downloads": -1,
"filename": "rave_python-1.0.2-py3-none-any.whl",
"has_sig": false,
"md5_digest": "e6c22835ba58e0a4fcb43ee69abca614",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 39076,
"upload_time": "2019-08-23T11:39:07",
"url": "https://files.pythonhosted.org/packages/5b/09/2186f4f6184c180531ec8a25100978a0a7452f2e161d23b3eca7fa264bd7/rave_python-1.0.2-py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "803cf95b33e4795c2e343cdc1a5f8b0c",
"sha256": "ccd02f1325ed3b42818d080b1944f7588adb70a1a3322e5dd20a7fccaa2e1232"
},
"downloads": -1,
"filename": "rave_python-1.0.2.tar.gz",
"has_sig": false,
"md5_digest": "803cf95b33e4795c2e343cdc1a5f8b0c",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 44223,
"upload_time": "2019-08-23T11:39:09",
"url": "https://files.pythonhosted.org/packages/ff/37/45a94226a0c238409a8a46050f276cff1df5b51f9f6bbd9d8a56ddeac586/rave_python-1.0.2.tar.gz"
}
]
}