Statement API
The statement gives you windowed totals + live balances for a merchant. It powers the Statement page in the dashboard.
GET /v1/statement
Aggregate over a time window.
Query parameters
| Param | Type | Notes |
|---|---|---|
since | RFC3339 | Window start. Defaults to lifetime |
before | RFC3339 | Window end. Defaults to now |
currency | string | ISO-4217. Defaults to merchant's default_currency |
format | string | json (default) or csv |
include | string | Only with format=csv: transactions switches to per-transaction CSV |
Response 200 (JSON):
{
"merchant_id": "...",
"currency": "KES",
"since": "2026-04-19T10:00:00Z",
"before": "2026-05-19T10:00:00Z",
"inbound_succeeded": { "count": 2, "amount": 20.00 },
"fees_paid": 0.00,
"refunds_succeeded": { "count": 4, "amount": 20.00 },
"payouts_succeeded": { "count": 0, "amount": 0.00 },
"payouts_pending": { "count": 0, "amount": 0.00 },
"available_payable": 0.00,
"payable_pending": 0.00
}CSV exports
Aggregate — ?format=csv returns a 2-row CSV:
merchant_id,currency,since,before,inbound_succeeded_count,inbound_succeeded_amount,...
abc123,KES,...
Transactions — ?format=csv&include=transactions returns one row per money-movement event (payment/refund/payout) in the window:
kind,id,status,amount,currency,channel,reference,channel_receipt,occurred_at
payment,...
refund,...
payout,...
The transactions CSV streams internally via cursor pagination (page size 1000). Server-side cap of 50,000 rows per response.
Window semantics
The window applies to:
payments.created_atfor payment rowsrefunds.updated_atfor refund rows (timestamp of completion, not initiation)payouts.updated_atfor payout rows (same)
This matches the dashboard Statement page so the aggregate JSON and the transactions CSV agree.
Live balances
available_payable and payable_pending are NOT windowed — they're current ledger snapshots, aggregated across all of the account's wallets in the requested currency. For a single wallet's balance, use GET /v1/wallets/{id}/balance instead.
Statement email schedule
Configure in the dashboard or via /docs/api/me (coming). Cadence none or monthly. We email the statement (with transactions CSV attached) on the configured cadence.
