Get a transaction
Get one of the caller's transactions by its id. Requires an authenticated, active user. Returns 404 when the transaction does not exist, or its account does not belong to the caller. For a transaction that needs OTP confirmation, continue with POST /v1/transactions/{id}/confirm.
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
Path Parameters
Unique identifier of the transaction.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X GET "https://example.com/v1/transactions/01a11715-7b0d-7e3f-9c2a-4d5e6f708192"{ "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" }}{ "code": "BAD_REQUEST", "description": "Bad Request"}{ "code": "UNAUTHORISED", "description": "Unauthorised"}{ "code": "FORBIDDEN", "description": "Forbidden"}{ "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" }}{ "code": "RATE_LIMIT_EXCEEDED", "description": "Too Many Requests"}{ "code": "INTERNAL_ERROR", "description": "Internal Server Error"}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.
Confirm the transaction OTP POST
Confirm a pending transaction with its OTP code. Requires an authenticated, active user. The transaction must be `PENDING_OTP_CONFIRMATION`, and a matching OTP attempt must be pending for it. OTP applies only to transactions on the Choice payment route; other transactions return 400. A confirmed transaction moves to `CONFIRMED`. Returns 404 when the transaction does not exist, its account does not belong to the caller, or no OTP attempt is pending for it.