Wallet
Operations

Operations

Who calls these endpoints?External API (s2s)
Base path
/api/v1/wallet
Identity
Ed25519 request signature — X-Key-Id, X-Date, X-Nonce, Digest (when there is a body), X-Signature. ±5 min clock window, single-use nonce, optional per-key IP allow-list.
Authorization
The key must carry the wallet product and the wallet permission the call requires; a call without it gets 403 WALLET_INSUFFICIENT_SCOPE. Permissions per endpoint: Key permissions.
Cross-surface
Reading operations exists on all three surfaces. Intervention and reporting are panel-only: operations/:id/intervention-requests, withdrawals/:id/intervention-requests, intervention-requests/*, suspense-funds/*, operations/export, ops-health, operations/:id/receipt.pdf — no s2s equivalents.

Every money-moving call produces an operation — a first-class object with a record, a status, fees, a ledger reference and audit history. It is the single source for reconciliation, support and reporting.

Listing

GET /api/v1/wallet/operations
ParameterDescription
endUserIdOperations of a given user
walletAccountIdOperations of a given account
destinationWalletAccountIdBy destination account
statusStatus filter
operationTypeType filter
limitPage size (max 100)
cursorPagination cursor

Pagination is cursor-based; there is no offset. The page arrives under data.operations with the next-page cursor in data.nextCursor; send it as cursor to fetch the next page.

⚠️

Do not expect offset pagination. Because the list grows over time, offsets would skip or duplicate records — a cursor prevents that structurally.

A single operation

GET /api/v1/wallet/operations/{operationId}

Returned fields:

FieldDescription
idOperation id
operationTypeType (W2W_TRANSFER, TOPUP_CARD, …)
statusStatus
sourceWalletAccountIdSource account — on top-ups this is the credited account
destinationWalletAccountIdDestination account (empty on top-ups)
destinationRefDestination reference (wallet no / IBAN)
destinationNameMaskedMasked destination name
assetCurrency / asset
amountTransaction amount (minor-unit)
feeTotal · taxTotal · totalChargeFee, tax and total
scheduleVersionIdFee schedule version applied
ledgerTxnRefLedger transaction reference
fraudDecisionRisk decision
fraudTraceIdTrace key of the risk evaluation. Use it to look the same evaluation up through the Fraud API. null when no evaluation is attached.
failureCode · failureReasonFailure cause
paymentPurposePurpose code
createdAt · updatedAtTimestamps

Type-specific fields:

FieldOn which type
rail · beneficiaryIbanMasked · bankRef · bankStatusBank integration operations
fundingSourceType · paymentRef · agentIdTop-ups
commissionTotal · commissionScheduleVersionId · orderRefWallet payments
⚠️

On a top-up, sourceWalletAccountId is the destination account. A top-up is money in; the "operation's wallet" field carries the credited account and destinationWalletAccountId stays empty. Write your reports accordingly, or top-ups will appear to have no source account.

Receipts

GET /api/v1/wallet/operations/{operationId}/receipt

The receipt is the shareable transaction document. The receiptUrl returned by transfer and payment responses points to the same document.

On the end-user surface:

GET /api/portal/v1/wallet/me/operations
GET /api/portal/v1/wallet/me/operations/{id}
GET /api/portal/v1/wallet/me/operations/{id}/receipt
GET /api/portal/v1/wallet/me/operations/export

Portal endpoints return only the session owner's own operations.

Export

GET /api/panel/v1/wallet/operations/export

Filters mirror the listing endpoint. Narrow the date range for large exports.

Reconciliation states

StatusMeaningCorrect behaviour
BANK_PROCESSINGIn flight on the bank sideWait
AWAITING_RECONOutcome uncertainDo not retry; wait for reconciliation
HELDHeld by a risk decisionTell the user "under review"
REVERSINGA reversal or card top-up refund has started and awaits its resultWait; the result is REVERSED. If the ledger rejects it: AWAITING_RECON for a reversal, COMPLETED for a card top-up refund (no money moved)
EXPIREDTimed out before confirmationA new operation can be started
⚠️

AWAITING_RECON, HELD and REVERSING are not terminal. An integration that treats them as failures misinforms users and creates double-processing risk.

Audit history

Every status transition writes a history record — from which state to which, when and by what trigger. This is how your support team answers "what happened to this transaction". Panel side: Panel — Operations & Intervention.

Common mistakes

SymptomCauseFix
Records skipped while paginatingOffset-style logicUse the cursor from the response
Top-ups appear to have no source accountThe credited account is in sourceWalletAccountIdBranch report logic by type
An AWAITING_RECON operation was restartedMistaken for terminalWait for reconciliation
Fee report does not reconcileThe schedule version changedMatch on scheduleVersionId