List transactions
List the caller's transactions, newest first, across every account they hold in the organization. Set account_id to scope the list to one account. Requires an authenticated, active user. The list paginates with size, after, and before. Set updated_after to sync incrementally instead of filtering: the server then returns only transactions changed since that instant, oldest change first, and rejects direction, type, from, or to in the same request. Keep the highest updated_at seen as the next watermark and upsert items by id. The server serves roughly the last 13 months of transactions, so an offline cache should expire items older than 12 months.
Authorization
oauth2 Create a client with POST /v1/oauth/clients, then exchange its credentials for an access token. AUTHORIZATION_CODE clients act on behalf of a signed-in user and always use PKCE; CLIENT_CREDENTIALS clients act as themselves. A client may only be granted scopes its creator already holds — read the grantable list from GET /v1/oauth/clients/scopes.
In: header
Query Parameters
Unique identifier of the account. Omit it to list every account the caller holds in the organization. An account the caller does not hold returns an empty page.
uuidMaximum number of transactions to return in one page. Defaults to 20.
0 < valueCursor from a previous page's next link. Returns the page after it.
Cursor from a previous page's prev link. Returns the page before it.
Filter by transaction direction. One of INCOMING (money arrived on the account) or OUTGOING (money left the account). Omit it to return both directions.
Filter by transaction type, such as PAY_BILL, BUY_GOODS, or SEND_MONEY. Omit it to return every type.
Start of the time range, inclusive. ISO 8601 timestamp with a timezone.
date-timeEnd of the time range, exclusive. ISO 8601 timestamp with a timezone.
date-timeIncremental sync: return only transactions modified after this instant, oldest change first. ISO 8601 timestamp with a timezone. Cannot be combined with direction, type, from, or to — a filtered sync's watermark would silently exclude the filtered-out rows from an offline cache forever. Keep one watermark per user per organization. The server re-delivers a trailing safety window, so keep the exact maximum updated_at seen and upsert items by id.
date-timeResponse Body
application/json
application/json
application/json
application/json
application/json
application/json
curl -X GET "https://example.com/v1/transactions?account_id=550e8400-e29b-41d4-a716-446655440000&size=20&after=eyJpZCI6IjU1MGU4NDAwLWUyOWItNDFkNC1hNzE2LTQ0NjY1NTQ0MDAwMCJ9&before=eyJpZCI6IjU1MGU4NDAwLWUyOWItNDFkNC1hNzE2LTQ0NjY1NTQ0MDAwMCJ9&direction=OUTGOING&type=SEND_MONEY&from=2026-01-01T00%3A00%3A00Z&to=2026-02-01T00%3A00%3A00Z&updated_after=2026-02-15T08%3A00%3A00Z"{ "data": [ { "id": "01a11715-7b0d-7e3f-9c2a-4d5e6f708192", "resource_id": "trx_01m4bhayrdfrzsrajdbsqq10cj", "mpesa_transaction_id": "ABCDE12345", "amount": { "value": 100000, "currency": "KES" }, "fee_amount": { "value": 5000, "currency": "KES" }, "status": "COMPLETED", "failure_reason": null, "transacted_at": "2026-01-20T10:30:00Z", "confirmed_at": "2026-01-20T10:30:05Z", "posted_at": "2026-01-20T10:30:10Z", "failed_at": null, "details": { "type": "BUY_GOODS", "till_number": "12345" } } ], "links": { "next": "/v1/payees?after=eyJpZCI6MX0", "prev": "/v1/payees?before=eyJpZCI6MX0" }}{ "code": "BAD_REQUEST", "description": "Bad Request"}{ "code": "UNAUTHORISED", "description": "Unauthorised"}{ "code": "FORBIDDEN", "description": "Forbidden"}{ "code": "RATE_LIMIT_EXCEEDED", "description": "Too Many Requests"}{ "code": "INTERNAL_ERROR", "description": "Internal Server Error"}List repayment transactions for an account GET
Retrieves immutable repayment allocations as recorded when each payment was applied to the account's installments. Later reversals and waivers are separate transaction events; this list never changes retroactively. Requires an authenticated user. Returns 404 when the account does not exist or is not the caller's. Supports keyset pagination through the `size`, `after`, and `before` query parameters.
Get the fee schedule GET
Get an account's fee schedule as data the caller can evaluate locally. Requires an authenticated user. The same schedule drives the live charge path, so a local estimate never drifts from the charged fee. Evaluate `rules` in order and stop at the first match. A transaction no rule matches, or a schedule with `evaluable` false, has no locally computable fee: fall back to `POST /v1/transactions/preview` for it. Returns 404 when `account_id` does not belong to the caller.