Payment Callback

When a transaction's status changes (e.g. a customer completes payment), Manjo sends a POST to the callback_url registered on the transaction. Your endpoint must be publicly reachable and respond with 2xx. This request is not authenticated with your API key — validate it on your side (e.g. by matching trx_id and the VA number).

Endpoint

POST {your_callback_url}
Content-Type: application/json

Body

Field Type Description
trx_id string Transaction ID returned by create transaction.
paid_at string Payment timestamp in RFC3339.
amount string Paid amount as a decimal string.
method integer 1 = Virtual Account.
status integer Payment status enum.
issuer_name string Issuer bank code.
customer_name string Customer name.
method_payload.bank_code string Bank code.
method_payload.virtual_account_no string Paid VA number.

Example

Request body

{
	"trx_id": "cmqqbpyw1000101msrvflho87",
	"paid_at": "2026-06-23T14:29:06+07:00",
	"amount": "10000.00",
	"method": 1,
	"status": 5,
	"issuer_name": "BMRI",
	"customer_name": "From API KEY",
	"method_payload": {
		"bank_code": "BMRI",
		"virtual_account_no": "7001400002025151"
	}
}

Status values

Value Status Meaning
0 Pending Not yet paid (default for new transactions).
1 Reject Rejected by the payment network.
2 Cancel Cancelled at the payment network's request.
3 Expired Time limit reached without payment.
4 Obscure Undefined status from the bank / network.
5 Completed Successfully paid and settled.

Notes

  • Callbacks are not authenticated with X-API-KEY.
  • Treat repeated callbacks for the same trx_id as idempotent. A completed transaction is never reopened.
  • Dynamic VA numbers are deactivated after successful payment.