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.

Net amount = transaction value minus MDR (Merchant Discount Rate) and any applicable fees. You will always receive the net figure, the gross transaction amount with processing costs already deducted.
01
Customer pays
Funds collected by partner bank
02
Settlement hold
Funds held in custodian account
03
Payout day
Net amount transferred via CEFT
04
Report sent
6pm — detailed payout report

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.

For reconciliation: match the bank reference number in your payout report against the incoming CEFT transfer on your bank statement. If the amounts match, your settlement is complete.

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.

T+2 means bank working days only. If the T+2 date falls on a weekend or public holiday, the payout moves to the next available bank working day.

How T+2 works (examples)

PAYMENT ACCEPTED ONT+1PAYOUT 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.

Payouts may occasionally be delayed due to bank system downtime(your bank or the partner bank) or other technical issues outside OnePay's control. If a CEFT transfer fails, for example due to the beneficiary bank being temporarily offline or an account being in inactive mode, you will be informed and the payout will be rescheduled for the next payout cycle.

American Express (Amex) payouts

Amex transactions follow a T+3 schedule, one additional working day compared to Visa, Mastercard, and other payment methods. OnePay is actively working with its banking partner to align Amex payouts with the standard T+2 schedule.
PAYMENT METHODPAYOUT SCHEDULENOTES
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.

If your payout has been held or delayed, contact your OnePay relationship officer immediately. They can advise on the specific reason and the steps needed to release the hold.

Reasons a payout may be held

01
Unresolved chargeback
A cardholder has raised a dispute with their issuing bank. Payouts related to disputed transactions are held until the chargeback is resolved, either in your favour or settled.
02
Business nature conflict
A discrepancy has been identified between the business type you registered with OnePay and the actual transactions being processed. Your account is reviewed until the nature of business is confirmed and aligned.
03
Suspicious transaction flagged by card networks
Visa or Mastercard's fraud detection systems have flagged one or more transactions as suspicious. Payouts are held pending a review by the card network and OnePay's risk team.
04
Chargeback recoveries due
Outstanding chargeback amounts owed to OnePay from previous disputes may be offset against your upcoming payout until the recovery balance is cleared.

Technical delays

Beyond holds, payouts can be delayed by technical issues that are outside OnePay's control:

CAUSEWHAT 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.
When a payout fails due to a bank-side issue, OnePay will inform you directly and reschedule the transfer for the next payout cycle. You do not need to raise a new request, the rescheduling is automatic.

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.

Common use cases:matching a customer's payment to your payout report, confirming commission deductions for finance reporting, building a reconciliation dashboard, or auditing individual transactions against your bank statement.
GEThttps://api.onepay.lk/v3/payout/transaction/?onepay_transaction_id={onepay_transaction_id}
AUTHENTICATION
HEADERVALUEREQUIRED
Authorization
Your App Token (e.g. 2c4e7c3ee0013882...)
Yes
Content-Type
application/json
Yes
QUERY PARAMETERS
PARAMETERTYPEINDESCRIPTION
onepay_transaction_id
required
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.
RESPONSE PARAMETERS, 200 OK
FIELDTYPEDESCRIPTION
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 settled
echo "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:

net_amount   −   commission_amount   =   settlement_amount
FIELDEXAMPLEWHAT 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.
The 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.

Common use cases: end-of-day reconciliation jobs, month-end finance reports, ERP settlement imports, identifying transactions where settlement_date is null (not yet settled), and verifying total payout amounts against your bank statement for a given period.
GEThttps://api.onepay.lk/v3/payout/transactions/?start_date={start_date}&end_date={end_date}&page={page}&page_size={page_size}
AUTHENTICATION
HEADERVALUEREQUIRED
Authorization
Your App Token (e.g. 2c4e7c3ee0013882...)
Yes
QUERY PARAMETERS
PARAMETERTYPEREQUIREDDESCRIPTION
start_date
required
string
Yes
Start of the date range in YYYY-MM-DD format, e.g. 2026-04-01. Inclusive.
end_date
required
string
Yes
End of the date range in YYYY-MM-DD format, e.g. 2026-04-28. Inclusive.
page
required
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_size
required
integer
Yes
Number of records to return per page. Recommended: 20100. Use a consistent value when paginating to avoid missing or duplicating records.
RESPONSE PARAMETERS, 200 OK
FIELDTYPEDESCRIPTION
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.
Identifying unsettled transactions: filter the results for records where 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.

total_pages  =  Math.ceil( data.count  /  page_size )

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-paginated
function 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 VALUEWHAT IT MEANSACTION
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.