invest, which creates a Payment: one attempt to move money to Ndovu, with its own reference. Once the money arrives, the Payment completes and a Transaction is created for the investment. Ndovu then invests it, and the customer receives units in the plan.
Before you start
-
Your account has a
referenceCodein your configuration. Your customers’ payment references start with it (e.g.ACM7F3K9Q). Until it’s set,investreturns403 PARTNER_REFERENCE_CODE_MISSING. - The customer is onboarded.
-
The plan is one of your products and accepts new money (
investable: true). -
The channel is enabled for your account:
bankTransferEnabledormpesaEnabledin your configuration.
Request
- Bank transfer
- M-Pesa
- Node.js
- Python
Idempotency-Key
Everyinvest call needs an Idempotency-Key header: a value you generate (a UUID is a good choice) that identifies one intended investment on your side. Save it with your own order record before calling us, and send the same key on every retry of that investment. See Retrying.
Body
Any other field is refused.
Minimums
Every plan has a minimum per currency, and a separate minimum for top-ups. They are in the plan’sminInvestableAmounts (first investment) and minTopUpAmounts (top-up) from Getting Products. The same minimums apply to every channel and every partner. A currency with no minimum set can’t be used for that plan.
Response
201 Created with the new Payment (or 200 OK with the same Payment when you resend a key you’ve used before):
transactionId is null until the Payment completes. That’s when the Transaction is created.
Completing the payment
- Bank transfer
- M-Pesa
Show your customer the transfer instructions, built from the response:
SendWith the example response above, that reads: send KES 5,000 to Ndovu Example Account, Example Bank, account 0000000000, with the reference ACM7F3K9Q.The customer (or you, on their behalf) makes the transfer. The reference must be in the transfer’s memo or narration: it’s how we match the money to the Payment. The amount must be exactlycurrencyfinalAmounttobankDetails.accountName,bankDetails.bankName, accountbankDetails.accountNumber, with the referencereference.
finalAmount.A bank transfer that never arrives expires after 5 days and the Payment becomes FAILED. If the money arrives later, we still match it and our team follows up.Retrying
If a call times out or fails with a5xx, resend it with the same Idempotency-Key. You can never create the same investment twice:
Keys never expire. To try again after a Payment
FAILED, call invest with a new key: a failed Payment is never reused, and resending its key just returns it, still FAILED.
Errors
See Errors for the format.

