Transactions
List Transactions
Retrieve a paginated list of transactions with optional filters for date range, currency, and status.
List Transactions
GET /v1/transactions
Returns a cursor-paginated list of transactions for your account, ordered newest first. Page size is fixed at 10 per page.
Request
raw HTTP
npm install @e-pay/nodepip install epaycomposer require epay-et/php-sdkgo get github.com/epay-et/go-sdk# All transactions
curl "https://api.e-pay.et/v1/transactions" \
-H "Authorization: Bearer sk_live_your_key_here"
# With filters
curl "https://api.e-pay.et/v1/transactions?status=completed¤cy=ETB&from=2026-08-01&to=2026-08-31" \
-H "Authorization: Bearer sk_live_your_key_here"
# Next page
curl "https://api.e-pay.et/v1/transactions?cursor=eyJjcmVhdGVkQXQi..." \
-H "Authorization: Bearer sk_live_your_key_here"
import { Epay } from '@e-pay/node';
const epay = new Epay({ apiKey: process.env.EPAY_SECRET_KEY });
// Iterating a page walks every following page, fetching lazily and
// carrying the filters along — no cursor bookkeeping.
for await (const transaction of await epay.transactions.list({
status: 'completed',
currency: 'ETB',
from: '2026-08-01',
to: '2026-08-31',
})) {
console.log(transaction.reference, transaction.amount);
}
// Or drive it a page at a time:
const page = await epay.transactions.list();
page.data; // exactly this page, no extra requests
page.hasMore; // boolean
await page.next(); // the next TransactionPage, or null
// Or cap the walk:
const recent = await (await epay.transactions.list()).toArray(50);const params = new URLSearchParams({
status: 'completed',
currency: 'ETB',
from: '2026-08-01',
to: '2026-08-31',
});
const res = await fetch(`https://api.e-pay.et/v1/transactions?${params}`, {
headers: { Authorization: `Bearer ${process.env.EPAY_SECRET_KEY}` },
});
if (!res.ok) throw new Error(`ePay ${res.status}: ${await res.text()}`);
const { data, nextCursor, hasMore } = await res.json();
// Feed nextCursor back as `cursor` to walk the following pages.
from datetime import date
from epay import Epay
epay = Epay() # reads EPAY_SECRET_KEY
# Iterating a page walks every following page, fetching lazily and
# carrying the filters along — no cursor bookkeeping.
for transaction in epay.transactions.list(
status="completed",
currency="ETB",
from_date=date(2026, 8, 1),
to_date=date(2026, 8, 31),
):
print(transaction["reference"], transaction["amount"])
# Or drive it a page at a time:
page = epay.transactions.list()
page.data # exactly this page, no extra requests
page.has_more # bool
page.next_page() # the next TransactionPage, or None
# Or cap the walk:
recent = epay.transactions.list().to_list(limit=50)import os
import requests
res = requests.get(
"https://api.e-pay.et/v1/transactions",
headers={"Authorization": f"Bearer {os.environ['EPAY_SECRET_KEY']}"},
params={
"status": "completed",
"currency": "ETB",
"from": "2026-08-01",
"to": "2026-08-31",
},
timeout=30,
)
res.raise_for_status()
body = res.json()
transactions = body["data"]
next_cursor = body["nextCursor"]
has_more = body["hasMore"]
# Feed next_cursor back as `cursor` to walk the following pages.
use Epay\Epay;
$epay = new Epay(); // reads EPAY_SECRET_KEY
// Iterating a page walks every following page, fetching lazily and
// carrying the filters along — no cursor bookkeeping.
foreach ($epay->transactions->list([
'status' => 'completed',
'currency' => 'ETB',
'from' => '2026-08-01',
'to' => '2026-08-31',
]) as $transaction) {
echo $transaction['reference'], ' ', $transaction['amount'], PHP_EOL;
}
// Or drive it a page at a time:
$page = $epay->transactions->list();
$page->data(); // exactly this page, no extra requests
$page->hasMore(); // bool
$page->nextPage(); // the next TransactionPage, or null
// Or cap the walk:
$recent = $epay->transactions->list()->toArray(50);$query = http_build_query([
'status' => 'completed',
'currency' => 'ETB',
'from' => '2026-08-01',
'to' => '2026-08-31',
]);
$ch = curl_init("https://api.e-pay.et/v1/transactions?{$query}");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('EPAY_SECRET_KEY')],
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
curl_close($ch);
if ($status >= 400) {
throw new RuntimeException("ePay {$status}: {$body}");
}
$page = json_decode($body, true);
// $page['data'], $page['nextCursor'], $page['hasMore']
// Iterate walks every page for you, fetching lazily and carrying the
// filters along — no cursor bookkeeping.
it := client.Transactions.Iterate(epay.ListParams{
Status: epay.StatusCompleted,
Currency: "ETB",
From: "2026-08-01",
To: "2026-08-31",
})
for it.Next(ctx) {
transaction := it.Transaction()
log.Println(transaction.Reference, transaction.Amount)
}
if err := it.Err(); err != nil {
return err
}
// Or drive the cursor yourself:
page, err := client.Transactions.List(ctx, epay.ListParams{})
page.Transactions // exactly this page
page.HasMore // bool
next, err := page.Next(ctx) // nil when this was the last pagequery := url.Values{
"status": {"completed"},
"currency": {"ETB"},
"from": {"2026-08-01"},
"to": {"2026-08-31"},
}
req, \_ := http.NewRequestWithContext(ctx, http.MethodGet,
"https://api.e-pay.et/v1/transactions?"+query.Encode(), nil)
req.Header.Set("Authorization", "Bearer "+os.Getenv("EPAY_SECRET_KEY"))
res, err := http.DefaultClient.Do(req)
if err != nil {
return err
}
defer res.Body.Close()
if res.StatusCode >= 400 {
return fmt.Errorf("ePay %d", res.StatusCode)
}
var page struct {
Data []struct {
Reference string `json:"reference"`
Status string `json:"status"`
Amount string `json:"amount"`
} `json:"data"`
NextCursor \*string `json:"nextCursor"`
HasMore bool `json:"hasMore"`
}
if err := json.NewDecoder(res.Body).Decode(&page); err != nil {
return err
}
// Feed page.NextCursor back as `cursor` to walk the following pages.
Response
{
"data": [
{
"reference": "PAB12CD3420260813",
"merchantReference": "order_123",
"status": "completed",
"amount": "250.00",
"currencyCode": "ETB",
"paidAt": "2026-08-13T11:47:00.000Z",
"createdAt": "2026-08-13T11:30:00.000Z"
},
{
"reference": "PFF98AB1220260812",
"merchantReference": null,
"status": "pending",
"amount": "1500.00",
"currencyCode": "ETB",
"paidAt": null,
"createdAt": "2026-08-12T09:15:00.000Z"
}
],
"nextCursor": "eyJjcmVhdGVkQXQiOiIyMDI2LTA4LTEyVDA5OjE1OjAwLjAwMFoiLCJpZCI6ImZmOThhYjEyIn0",
"hasMore": true
}Query Parameters
Prop
Type
Response
Prop
Type
Transaction object
Prop
Type
Pagination
This endpoint uses cursor-based pagination with a fixed page size of 10.
First page Make a request without a cursor. You'll receive up to 10
transactions and a nextCursor if more exist.
Subsequent pages Pass the nextCursor from the previous response as the
cursor query parameter. Filters persist across pages.
Last page When hasMore is false and nextCursor is null, you've
reached the end.
Cursors are opaque and time-bound. Do not parse or construct them manually — always use the value returned by the API.
Errors
| Status | Description |
|---|---|
400 | from is after to. |
400 | Date range exceeds 90 days. |
400 | currency is not a valid 3-letter code. |
400 | status is not a recognized value. |
400 | cursor is malformed or expired. |
401 | Missing or invalid API key. |
Next: Retrieve a Transaction — fetch full details for a single transaction.