Cowdidocs
API ReferenceTransactions

List transactions

GET
/v1/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.

AuthorizationBearer <token>

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

account_id?string

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.

Formatuuid
size?integer

Maximum number of transactions to return in one page. Defaults to 20.

Range0 < value
after?string

Cursor from a previous page's next link. Returns the page after it.

before?string

Cursor from a previous page's prev link. Returns the page before it.

direction?string

Filter by transaction direction. One of INCOMING (money arrived on the account) or OUTGOING (money left the account). Omit it to return both directions.

type?string

Filter by transaction type, such as PAY_BILL, BUY_GOODS, or SEND_MONEY. Omit it to return every type.

from?string

Start of the time range, inclusive. ISO 8601 timestamp with a timezone.

Formatdate-time
to?string

End of the time range, exclusive. ISO 8601 timestamp with a timezone.

Formatdate-time
updated_after?string

Incremental 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.

Formatdate-time

Response 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"}