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_idas idempotent. A completed transaction is never reopened. - Dynamic VA numbers are deactivated after successful payment.