POST /api/transfer
Request
| Name | Type | Required | Description |
|---|---|---|---|
| inquiry_id | string | true | Inquiry identifier to process |
{
"inquiry_id": "01jj1g751vqw68ng5546xnda5c"
}
Response
| Name | Description |
|---|---|
| status | Operation status indicator. true indicates success, false indicates failure. |
| code | Machine-readable error code, present only on error responses. See Response codes below — match on this field, never on message. |
| message | Human-readable description, present where applicable. Wording may change without notice. |
| data | Inquiry/transfer outcome details. Always present: null when there is no inquiry to describe — on INQUIRY_NOT_FOUND (404) and on internal errors (HTTP 200 with status:false and a message). |
| data.inquiry_id | The inquiry identifier that was submitted. |
| data.merchant_transaction_id | The merchant-provided identifier tied to the inquiry. |
| data.status | The inquiry's current status: processing, pending, success, or fail. See Check Inquiry Status for the full status vocabulary. |
| data.amount | Transfer amount as a string with 2 decimal places (e.g., "100000.00"). |
| data.reason | Failure reason. Present only when data.status is fail. |
| data.payment_at | Completion timestamp, server time, YYYY-MM-DD HH:MM:SS (e.g., "2026-08-13 09:12:45"). Present only when data.status is success. |
Response codes
| HTTP | code | When | Recommended action |
|---|---|---|---|
| 200 | — | Transfer accepted and processing
| Wait for the webhook or poll Check Inquiry Status |
| 200 | — | Inquiry awaiting approval
| Approve the inquiry — approval is done on your side (support can assist) |
| 409 | DUPLICATE_TRANSFER | This inquiry was already executed
| Do not re-send. data.status is the current state; confirm the final result via webhook or /check/inquiry |
| 409 | TRANSFER_ALREADY_FAILED | The transfer for this inquiry failed
| Start a new inquiry with a new merchant_transaction_id |
| 409 | INQUIRY_EXPIRED | The inquiry passed its 30-minute expiry
| Start a new inquiry; reserved funds are returned |
| 404 | INQUIRY_NOT_FOUND | Unknown
| Check the id; use Check Inquiry Status to look up by merchant_transaction_id |
See the full error-code reference for every error code across both endpoints, plus the code- and field-stability contract.
{
"status": true,
"data": {
"inquiry_id": "01jj1g751vqw68ng5546xnda5c",
"merchant_transaction_id": "RP123333333",
"status": "processing",
"amount": "100000.00"
}
}
{
"status": false,
"code": "DUPLICATE_TRANSFER",
"message": "Transfer already submitted for this inquiry.",
"data": {
"inquiry_id": "01jj1g751vqw68ng5546xnda5c",
"merchant_transaction_id": "RP123333333",
"status": "success",
"amount": "100000.00",
"payment_at": "2026-08-13 09:12:45"
}
}
{
"status": false,
"code": "TRANSFER_ALREADY_FAILED",
"message": "Transfer for this inquiry already failed.",
"data": {
"inquiry_id": "01jj1g751vqw68ng5546xnda5c",
"merchant_transaction_id": "RP123333333",
"status": "fail",
"amount": "100000.00",
"reason": "Disbursement could not be processed, please contact support"
}
}
{
"status": false,
"code": "INQUIRY_NOT_FOUND",
"message": "Inquiry not found.",
"data": null
}
Retrying safely
Match on code, never on message — messages may be reworded without notice. New codes may be added over time; treat an unrecognized code as a generic failure and read data.status.
Never create a new inquiry with a new merchant_transaction_id until the original transfer's final status is known — doing so can pay the same beneficiary twice.
Webhook