Verify Payout
Check the current status and details of a payout after it has been initiated.
The Verify Payout endpoint lets you check the current status and details of a payout (transfer) after it has been initiated.
Because transfers are asynchronous, a payout may not complete immediately. Verification helps you:
- Confirm whether funds were successfully delivered
- Check if a transfer is still processing
- Identify failures, reversals, or blocks
- Support customer and vendor inquiries
Always treat the transfer initialization response as temporary. Use verification or webhooks to confirm the final state.
Endpoint
GET /v2/payouts/{reference}/verify
Host: api.chapa.coAuthentication
Headers
| Name | Required | Description |
|---|---|---|
Authorization | Yes | Bearer <PRIVATE_API_KEY> |
Content-Type | Yes | application/json |
Path Parameter
| Name | Type | Required | Description |
|---|---|---|---|
reference | string | Yes | Payout reference (merchant reference or Chapa reference) |
Example Request
Example Request
cURL
curl -X GET https://api.chapa.co/v2/payouts/PAYOUTREF123/verify \
-H "Authorization: Bearer CHAPA_TEST_xxxxxxxxxxxxx"JavaScript
const response = await fetch("https://api.chapa.co/v2/payouts/PAYOUTREF123/verify", {
method: "GET",
headers: {
"Authorization": "Bearer CHAPA_TEST_xxxxxxxxxxxxx"
}
});
const data = await response.json();
console.log(data);Example Response
Example Response
Success
{
"status": "success",
"message": "Payout verification successful",
"data": {
"merchant_reference": "PAYOUT_20251107_001",
"amount": 150000,
"currency": "ETB",
"status": "completed",
"account_number": "1001234567890",
"account_name": "Abebe Bikila",
"bank_slug": "ABY",
"service_fee": 1500,
"created_at": "2025-11-07T12:10:00Z",
"updated_at": "2025-11-07T12:15:00Z",
"processed_at": "2025-11-07T12:15:00Z",
"reason": "Vendor payout for service"
}
}Response Fields
Transfer Object (data)
| Field | Type | Description |
|---|---|---|
merchant_reference | string | Merchant-generated reference |
amount | number | Transfer amount |
currency | string | ISO currency code |
status | string | Transfer status |
account_number | string | Destination account |
account_name | string | Recipient name |
bank_slug | string | Bank or wallet identifier |
service_fee | number | Fee charged |
created_at | string | Transfer creation timestamp |
updated_at | string | Last status update |
processed_at | string | null | Completion timestamp |
reason | string | Optional description |
Transfer Statuses
| Status | Meaning |
|---|---|
pending | Transfer created |
processing | Transfer in progress |
completed | Funds delivered |
failed | Transfer failed |
blocked | Compliance or risk issue |
reversed | Funds reversed |
auth_needed | Additional authentication required |
otp_needed | OTP verification required |
How to Use Verification
Typical Flow
- Initiate transfer (
POST /v2/payouts) - Receive initial
pendingstatus - Wait for webhook or poll verification
- Act based on final status:
completed→ mark payout successfulfailed/reversed→ notify user or retryauth_needed/otp_needed→ prompt for required action
Best Practices
- Prefer webhooks for final status updates
- Use verification as a fallback or manual check
- Store all status changes for audit and reconciliation
- Never assume completion immediately after creation
Common Errors
| HTTP | Error Code | Description |
|---|---|---|
| 400 | MISSING_REQUIRED_FIELD | Reference is missing |
| 404 | NOT_FOUND | Payout not found |
| 500 | PROCESSING_FAILED | System issue fetching payout |
Next Steps
- Payout - Initiate a payout
- Bulk Payout - Send multiple payouts
- Webhooks - Handle payout events