Payments
Start a checkout, get a URL, send your customer to it. One call.
#Start a payment
Starts a checkout and returns a URL to send the customer to.
curl https://api.paymonetra.com/v1/payments \
-H "Authorization: Bearer sk_live_..." \
-d amount=45000 \
-d reference=SF-10482 \
-d description="Ankara bundle"{
"reference": "ef8e7ff7078b893d03",
"merchant_reference": "SF-10482",
"status": "pending",
"amount": 45000,
"amount_requested": 45000,
"account_number": "5048135286",
"account_name": "MONETRA TECHNOLOGIES LTD",
"checkout_url": "https://pay.paymonetra.com/ef8e7ff7078b893d03",
"collects": ["bank_transfer"]
}This is the call you want. The payer is given an account borrowed for twenty minutes and locked to exactly this amount, so amount is a round figure and equals amount_requested.
reference is your own order id and makes this idempotent: calling it again with the same one returns the same session rather than quoting a second amount for one order. Sending it is strongly recommended.
The checkout page collects a name and email before it shows an account, because a receipt has to go somewhere. Send customer_name and customer_email and the payer is never asked.
amount_over_limit is refused here rather than at the payer's bank, so you find out instead of your customer watching a transfer bounce.
#amount is not amount_requested
amount_requested is what you asked for. amount is what the payer must send. They differ whenever the session carries a kobo suffix.
| field | what it is | what to do with it |
|---|---|---|
amount_requested | what you passed in | reconcile your own order against it |
amount | what the payer must transfer | never display this yourself: send them to checkout_url and let the page say it |
reference | our id for the session | store it; it comes back on the webhook as checkout_reference |
merchant_reference | the reference you sent | your own order id, echoed |
checkout_url | the page to send the payer to | on pay.paymonetra.com, deliberately not on your domain or ours |
#Idempotency
Send reference, your own order id. Asking again with the same one returns the same session rather than quoting a second amount for one order. It is what makes a retry safe.
#Limits are checked here, not at the bank
A payment above what the account can take is refused with amount_over_limit, so you find out instead of your customer watching a transfer bounce.
#Taking USDT instead
A separate endpoint, not a flag on this one: POST /payments names a naira price, POST /payments/crypto names a coin amount. Crypto payments is the whole of it.
#Confirming it
Two signals, and you want both: the redirect names the payment, the webhook proves it. How to confirm a payment is the whole pattern.
#Fetch a payment
The session, scoped to the caller's own merchant and mode.
Scoped to your merchant and mode. For the payer-facing view of the same session, with the instruction and countdown, see GET /checkout/{reference}.