Search Documentation
Search across all documentation pages, APIs and guides.
How Payouts Work
When a customer successfully completes a payment on your website, the funds are collected by OnePay's partner bank custodian account on your behalf and held in a settlement account. On your scheduled payout date, OnePay transfers the net amount directly to your registered bank account.
Payout report
You will receive a comprehensive payout report every day at 6:00 PM on your scheduled payout date, but only on days when a payout actually occurs. If you have no transactions due for settlement that day, no report is sent.
The report includes a bank reference number for every payout transfer, giving you everything you need to tally the payout amount against your own records for reconciliation purposes.
Payout method
All payouts are sent as CEFT (Common Electronic Fund Transfer) transactions directly to your registered bank account. This is the standard interbank transfer mechanism in Sri Lanka.
Current limitations
No early payouts
OnePay does not support early or accelerated payouts before the scheduled settlement date at this time.
No split payouts
OnePay does not support split payout options (distributing a single payout to multiple bank accounts) at this time.
Haven't received your payout?
If your expected payout has not arrived, please contact your OnePay relationship officer directly for clarification. Do not raise a dispute with your bank first, your relationship officer can view the exact transfer status and reason for any delay or hold.
Payout Schedule
OnePay operates on a T+2 payout cycle, you receive your payout two bank working days after the transaction date. Weekends and public holidays are not counted.
How T+2 works (examples)
| PAYMENT ACCEPTED ON | T+1 | PAYOUT ON (T+2) |
|---|---|---|
Monday | Tuesday | Wednesday |
Tuesday | Wednesday | Thursday |
Wednesday | Thursday | Friday |
Thursday | Friday | Monday (weekend skipped) |
Friday | Monday | Tuesday (weekend skipped) |
Payout time
Payouts are processed before 6:00 PMon the payout day. Your payout report is also sent at this time. Note that the exact credit time into your bank account depends on your bank's processing. CEFT transfers typically reflect within a few hours but may take until end of business day.
American Express (Amex) payouts
| PAYMENT METHOD | PAYOUT SCHEDULE | NOTES |
|---|---|---|
Visa | T+2 bank working days | Standard schedule |
Mastercard | T+2 bank working days | Standard schedule |
Other methods | T+2 bank working days | Standard schedule |
American Express | T+3 bank working days | Schedule alignment in progress |
Payout Holds & Delays
In certain circumstances, OnePay may place a hold on your payout. This is done to protect both merchants and cardholders and to comply with card network regulations. Held payouts are released once the underlying issue is resolved.
Reasons a payout may be held
Technical delays
Beyond holds, payouts can be delayed by technical issues that are outside OnePay's control:
| CAUSE | WHAT HAPPENS |
|---|---|
Bank system downtime | The CEFT transfer cannot be processed. OnePay will retry on the next available opportunity and notify you of the delay. |
Beneficiary account inactive | Your registered bank account is in inactive or dormant mode. The payout fails at the receiving bank. OnePay notifies you and reschedules for the next payout cycle. |
Incorrect account details | The CEFT transfer is rejected by the receiving bank. Contact your relationship officer to update your registered bank account details. |
Transaction Lookup
The Transaction Lookup API gives you a real-time settlement breakdown for any individual OnePay transaction. Given a transaction ID, it returns the exact net amount received, the commission rate and amount that was deducted, the final settlement amount credited to your account, and the precise date and time that settlement occurred.
This is the endpoint to use when you need to verify exactly what was paid out for a specific transaction, whether you are reconciling a payout report, investigating a discrepancy with your finance team, or building an automated reconciliation pipeline inside your ERP or accounting system.
| HEADER | VALUE | REQUIRED |
|---|---|---|
Authorization | Your App Token (e.g. 2c4e7c3ee0013882...) | Yes |
Content-Type | application/json | Yes |
| PARAMETER | TYPE | IN | DESCRIPTION |
|---|---|---|---|
onepay_transaction_idrequired | string | Query | The OnePay transaction ID returned in data.ipg_transaction_id when the payment was originally created. This is the same ID you should have stored at checkout time. |
| FIELD | TYPE | DESCRIPTION |
|---|---|---|
status | number | 200 on success. |
message | string | "Transaction fetched successfully" |
data.onepay_transaction_id | string | The OnePay transaction identifier, echoed back for confirmation. |
data.order_id | string | Your internal order or reference ID as passed during transaction creation. |
data.currency | string | Currency of the transaction, e.g. LKR. |
data.net_amount | string | The gross transaction amount the customer paid. |
data.commission_rate | string | The MDR (Merchant Discount Rate) percentage applied to this transaction, e.g. "2.50" for 2.5%. |
data.commission_amount | string | The exact fee amount deducted from the gross transaction. This is what OnePay charged for processing. |
data.settlement_amount | number | The net amount credited to your bank account after deducting the commission. This is the figure that should appear on your bank statement and payout report. |
data.settlement_date | string | The date and time the settlement was processed, in YYYY-MM-DD HH:mm format. |
Code examples
$tx_id = 'WQBV118E584C83CBA50C6'; // stored at checkout time$ch = curl_init('https://api.onepay.lk/v3/payout/transaction/?onepay_transaction_id=' . $tx_id);curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => true,CURLOPT_HTTPHEADER => ['Authorization: YOUR_APP_TOKEN','Content-Type: application/json',],]);$res = json_decode(curl_exec($ch), true);// Use for reconciliation$settlement = $res['data']['settlement_amount']; // what hit your bank$commission = $res['data']['commission_amount']; // MDR deducted$settled_on = $res['data']['settlement_date']; // when it was settledecho "Settled: LKR {$settlement} on {$settled_on} (MDR: {$commission})";
Understanding the amounts
The three amount fields form a simple equation you can use to verify every settlement:
| FIELD | EXAMPLE | WHAT IT MEANS |
|---|---|---|
net_amount | "5.00" | Gross amount the customer paid. |
commission_rate | "2.50" | Your MDR: 2.50% applied to this transaction. |
commission_amount | "0.13" | LKR 0.13 deducted as the processing fee (2.5% of LKR 5.00). |
settlement_amount | 4.87 | What was credited to your bank account: 5.00 − 0.13 = 4.87. |
settlement_date in the response reflects when OnePay processed the payout, not when it appeared in your bank account. Allow for CEFT processing time (usually same day, before 6 PM). If settlement_date is populated, the funds have left OnePay and are in transit to your bank.Transaction List
The Transaction List API retrieves a paginated list of all settlement transactions within a specified date range. Use this to pull your full payout history for any period, ideal for building automated reconciliation pipelines, generating finance reports, and auditing settlement activity at scale without downloading reports manually from the dashboard.
Unlike the single Transaction Lookup endpoint which requires a known transaction ID, this endpoint lets you query by date range and page through all results, making it the right tool for period-end reconciliation, month-close accounting processes, and any scenario where you need to process multiple settlements in bulk.
settlement_date is null (not yet settled), and verifying total payout amounts against your bank statement for a given period.| HEADER | VALUE | REQUIRED |
|---|---|---|
Authorization | Your App Token (e.g. 2c4e7c3ee0013882...) | Yes |
| PARAMETER | TYPE | REQUIRED | DESCRIPTION |
|---|---|---|---|
start_daterequired | string | Yes | Start of the date range in YYYY-MM-DD format, e.g. 2026-04-01. Inclusive. |
end_daterequired | string | Yes | End of the date range in YYYY-MM-DD format, e.g. 2026-04-28. Inclusive. |
pagerequired | integer | Yes | Page number to retrieve. Starts at 1. Use with count and page_size in the response to determine how many pages exist. |
page_sizerequired | integer | Yes | Number of records to return per page. Recommended: 20–100. Use a consistent value when paginating to avoid missing or duplicating records. |
| FIELD | TYPE | DESCRIPTION |
|---|---|---|
status | number | 200 on success. |
message | string | "Transactions fetched successfully" |
data.count | number | Total number of transactions matching your date range across all pages. Use this to calculate total pages: Math.ceil(count / page_size). |
data.page | number | The current page number returned. |
data.page_size | number | Number of records returned in this response. |
data.results | array | Array of transaction objects for this page. |
data.results[].onepay_transaction_id | string | OnePay's unique transaction identifier. |
data.results[].order_id | string | Your internal order or reference ID as passed at transaction creation. |
data.results[].currency | string | Transaction currency, e.g. LKR. |
data.results[].net_amount | string | Gross amount the customer paid. |
data.results[].commission_rate | string | The MDR percentage applied to this transaction. |
data.results[].commission_amount | string | The fee amount deducted from the gross transaction. |
data.results[].settlement_amount | number | Net amount credited to your bank account after fee deduction. |
data.results[].settlement_date | string | null | null means the transaction has not yet been settled, it is pending in the upcoming payout cycle. A date value confirms settlement has been processed. |
settlement_date === null. These are transactions that have been captured but not yet transferred to your bank account, they will appear in a future payout cycle.Pagination
The API uses page-based pagination. The data.count field tells you the total number of records, use it to calculate how many pages you need to fetch to get the complete dataset for your date range.
For example: count = 322 with page_size = 20 means Math.ceil(322/20) = 17 pages. Loop from page=1 to page=17 to retrieve all records.
Code examples
// Fetch all transactions for April 2026 — auto-paginatedfunction fetchAllTransactions($start, $end, $token) {$all = [];$page = 1;do {$url = "https://api.onepay.lk/v3/payout/transactions/". "?start_date={$start}&end_date={$end}&page={$page}&page_size=100";$ch = curl_init($url);curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => true,CURLOPT_HTTPHEADER => ["Authorization: {$token}"],]);$res = json_decode(curl_exec($ch), true);$data = $res['data'];$all = array_merge($all, $data['results']);$total_pages = ceil($data['count'] / 100);$page++;} while ($page <= $total_pages);return $all;}$txns = fetchAllTransactions('2026-04-01', '2026-04-28', 'YOUR_APP_TOKEN');// Reconciliation — tally settled vs pending$settled = array_filter($txns, fn($t) => $t['settlement_date'] !== null);$pending = array_filter($txns, fn($t) => $t['settlement_date'] === null);$total_settled = array_sum(array_column($settled, 'settlement_amount'));echo "Settled: " . count($settled) . " txns | LKR {$total_settled}\n";echo "Pending: " . count($pending) . " txns (next payout cycle)\n";
Reading settlement_date: null
A null settlement date is not an error, it simply means the transaction has been captured but not yet included in a payout transfer. This will happen for transactions that fall within your date range but whose T+2 settlement date has not yet passed, or transactions currently under a payout hold.
| SETTLEMENT_DATE VALUE | WHAT IT MEANS | ACTION |
|---|---|---|
null | Transaction captured, settlement pending. Not yet transferred to your bank. | No action needed, will appear in next payout cycle. Check again after the T+2 window. |
"2026-04-28 15:37" | Settlement has been processed. Funds left OnePay at this timestamp. | Match settlement_amount against your bank statement CEFT credit for that date. |
On This Page