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/node
pip install epay
composer require epay-et/php-sdk
go 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&currency=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 page
query := 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.

Cursors are opaque and time-bound. Do not parse or construct them manually — always use the value returned by the API.


Errors

StatusDescription
400from is after to.
400Date range exceeds 90 days.
400currency is not a valid 3-letter code.
400status is not a recognized value.
400cursor is malformed or expired.
401Missing or invalid API key.

Next: Retrieve a Transaction — fetch full details for a single transaction.

On this page