PaymonetraDocs

Payments

Start a checkout, get a URL, send your customer to it. One call.

#Start a payment

POSThttps://api.paymonetra.com/v1/paymentsSecret key

Starts a checkout and returns a URL to send the customer to.

Terminal
curl https://api.paymonetra.com/v1/payments \
  -H "Authorization: Bearer sk_live_..." \
  -d amount=45000 \
  -d reference=SF-10482 \
  -d description="Ankara bundle"
JSON
{
  "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.

fieldwhat it iswhat to do with it
amount_requestedwhat you passed inreconcile your own order against it
amountwhat the payer must transfernever display this yourself: send them to checkout_url and let the page say it
referenceour id for the sessionstore it; it comes back on the webhook as checkout_reference
merchant_referencethe reference you sentyour own order id, echoed
checkout_urlthe page to send the payer toon 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

POSThttps://api.paymonetra.com/v1/payments/cryptoSecret key

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

GEThttps://api.paymonetra.com/v1/payments/{reference}Secret key

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}.