Transaction Status
Check the status of any payin or payout transaction using its transaction ID. This endpoint is useful for polling payment status when webhooks are not available or as a fallback to confirm a transaction's final state.
Endpoint
You can also use the alias endpoint /api/v1/merchant/status/{trx_id} — both return the same response.
Authentication required
Include your X-API-KEY header.
You can only query transactions created with your own API key.
See Authentication for details.
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
trx_id |
string | Required | The transaction ID returned in the payin or payout response (e.g. PAY_NEFGOQN6QWT4_1788451423) |
Response
Success Response (200)
{
"success": true,
"status": "initiated",
"transaction_id": "PAY_NEFGOQN6QWT4_1788451423",
"type": "payin",
"provider": "jeko",
"provider_ref": "6c7f6824-74e8-43ff-bc0f-9d1d0850078d",
"created_at": "2026-09-03 16:03:43",
"updated_at": "2026-09-03 16:03:43",
"data": {
"status": "initiated",
"message": "Redirect to payment page required.",
"provider": "jeko",
"provider_ref": "6c7f6824-74e8-43ff-bc0f-9d1d0850078d",
"action_url": "https://pay.wave.com/c/cos-2722qt5482jyw?a=100&c=XOF",
"fee_percent": 3.5,
"fee_amount": 3.5,
"net_amount": 96.5
}
}
Response Fields
| Field | Type | Description |
|---|---|---|
success |
boolean | true if the transaction was found |
status |
string | Current transaction status (see Status Values) |
transaction_id |
string | The transaction reference ID |
type |
string | payin or payout |
provider |
string | Payment provider used (e.g. jeko, intouch) |
provider_ref |
string | Provider's internal reference ID |
created_at |
string | Transaction creation timestamp (UTC) |
updated_at |
string | Last update timestamp (UTC) |
data |
object | Additional transaction details (fee, net amount, action URL, etc.) |
data.action_url |
string | Payment redirect URL (for payin transactions awaiting customer action) |
data.fee_percent |
float | Fee percentage applied to the transaction |
data.fee_amount |
float | Fee amount collected |
data.net_amount |
float | Net amount credited to the merchant wallet |
data.confirmation_type |
string|null | How the customer confirms: redirect (operator payment link), operator_push (PIN confirmation on the phone), sms_ussd (customer receives an SMS and must dial the USSD code to approve), otp (OTP collected on the hosted checkout page) |
data.otp_required |
boolean|null | true when the transaction is parked waiting for the customer to submit their Orange Money OTP on the hosted checkout page |
data.ussd_code |
string|null | USSD fallback code shown to the customer (e.g. #144# for Orange Money) |
data.instructions |
array|null | Step-by-step customer instructions displayed on the hosted checkout page |
Error Response (404)
{
"success": false,
"status": "failed",
"code": "NOT_FOUND",
"message": "Transaction not found.",
"transaction_id": null,
"data": null
}
Common cause of 404
The transaction is filtered by the API key owner. If you use an API key that belongs to a different merchant account, you will get a 404 even if the transaction exists. Always use the API key that was used to create the transaction.
Status Values
| Status | Description |
|---|---|
| pending | Transaction created, waiting for provider response |
| initiated | Provider has initiated the payment, customer action required (e.g. redirect to payment page) |
| timeout_review | Provider outcome is ambiguous. Do not retry, refund, or create a new transaction until reconciliation confirms the final state. |
| success | Transaction completed successfully, funds credited to merchant wallet |
| failed | Transaction explicitly failed at the provider level. A timeout alone is not considered a failure. |
| rejected | Transaction was rejected by the provider |
| refunded | Transaction was refunded to the customer |
Examples
cURL
curl -X GET "https://envoifacile.com/api/v1/merchant/transactions/PAY_NEFGOQN6QWT4_1788451423" \
-H "X-API-KEY: ef_live_your_api_key_here"
Using the /status/ alias
curl -X GET "https://envoifacile.com/api/v1/merchant/status/PAY_NEFGOQN6QWT4_1788451423" \
-H "X-API-KEY: ef_live_your_api_key_here"
PHP (cURL)
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://envoifacile.com/api/v1/merchant/transactions/PAY_NEFGOQN6QWT4_1788451423");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"X-API-KEY: ef_live_your_api_key_here",
]);
$response = curl_exec($ch);
curl_close($ch);
$data = json_decode($response, true);
echo $data['status']; // e.g. "success"
JavaScript (fetch)
const response = await fetch(
"https://envoifacile.com/api/v1/merchant/transactions/PAY_NEFGOQN6QWT4_1788451423",
{
headers: {
"X-API-KEY": "ef_live_your_api_key_here",
},
}
);
const data = await response.json();
console.log(data.status); // e.g. "success"
Polling recommendation
If you're polling this endpoint while waiting for a payment to complete,
we recommend checking every 3–5 seconds. Once the status becomes
success or failed, you should stop polling.
For real-time updates, consider using Webhooks instead.