Using the examples
These pages give complete, copy-pasteable requests for the transaction ingest API, one page per account holder type and per counterparty type, followed by every response your integration can receive. Use them alongside the field reference in Submitting transactions.
Every value in these examples is synthetic. Names, account numbers, BVNs, card identifiers, IP addresses and references are invented for illustration. Never copy production customer data into test requests, tickets or logs.
The examples use NGN as the institution base currency. It is only an example base currency: use the base currency
your administrator configured under Transaction Monitoring → Settings. See
Transaction monitoring settings.
The account holder is not "the sender"
Every transaction is recorded against an account holder: your institution's own customer (CUSTOMER) or general
ledger account (INTERNAL_GL) whose book the entry posts to. The account holder is the same party whichever way the
money moves:
direction | accountHolder | counterparty |
|---|---|---|
OUTBOUND | Your customer or GL, sending the money | The recipient |
INBOUND | Your customer or GL, receiving the money | The external sender |
So on an INBOUND transaction the account holder is the recipient, and the party who sent the money is the
counterparty. Use direction to tell sending from receiving; never read accountHolder as the sender.
The endpoint
POST /api/transactions
Each request submits exactly one transaction and receives OneView's decision in the same response. There is no batch endpoint. Use the exact path: a trailing slash is not accepted.
Authentication and headers
Authenticate with an API service account whose module scope is Transaction Monitoring or All licensed modules. See API Service Accounts to create one.
| Header | Value | Notes |
|---|---|---|
Authorization | Bearer <oneview-service-account-api-key> | Required on every request. |
Content-Type | application/json | Required. Without it, the body is not read and the request fails validation. |
- The service account's credential determines which tenant the transaction belongs to. Do not send a tenant field in
the body. The simplest integration omits the
X-Tenant-Idheader entirely. - Call the API from your servers, not from a browser. Server-to-server requests should not send an
Originheader. - The request body can be at most 1 MB.
- There is no separate idempotency header. The transaction reference and direction make every request safely repeatable. See Replays in Decision responses.
Before the first request, an administrator must set the base currency, and the licence must include the Transaction monitoring module with its Transactions sub-module. Rules, blacklist screening, PEP and sanction screening, and geography risk are optional licensed controls. When one is not licensed or not enabled, the request still succeeds, and only the decision changes.
The minimal request
This is the smallest valid body. Every field shown is required.
POST /api/transactions
Authorization: Bearer <oneview-service-account-api-key>
Content-Type: application/json
{
"transactionReference": "TXN-20260921-000001",
"direction": "OUTBOUND",
"accountHolderType": "CUSTOMER",
"paymentMethod": "NIP",
"channel": "MOBILE_APP",
"status": "POSTED",
"isCrossBorder": false,
"amount": "25000.00",
"currency": "NGN",
"executedAt": "2026-09-21T09:15:00Z",
"accountHolder": {
"customerUniqueId": "CUS-100231"
},
"counterparty": {
"counterpartyType": "EXTERNAL_BANK",
"accountName": "Demo Recipient Limited"
}
}
| Field | What it means | Why it matters for monitoring |
|---|---|---|
transactionReference | Your stable ID for the transaction. Up to 64 characters: letters, digits, ., _, :, / and -, starting with a letter or digit. | With direction, it identifies the transaction. Resending the same pair is a replay, not a new transaction. |
direction | OUTBOUND when money leaves the account holder's account, INBOUND when it arrives in it. | Rules and velocity windows often count only one direction. |
accountHolderType | Whose account the entry posts to: CUSTOMER or INTERNAL_GL. | Decides which account holder fields are required and which customer the activity is attributed to. |
paymentMethod | The rail used. | Rules are commonly scoped to a rail, such as NIP or SWIFT. |
channel | Where the transaction started. | Channel-specific rules, such as limits on USSD. |
status | Your core banking status: PENDING, POSTED or SETTLED. | Your lifecycle value only. It is not OneView's decision. |
isCrossBorder | Whether money crosses a national border. | Required. Cross-border activity also requires usdExchangeRate when the currency is not USD. |
amount | Principal amount, as a string. | The value most rules compare against. |
currency | Three uppercase letters. | Compared with the base currency to decide whether the transaction is foreign-currency. |
executedAt | When your system executed or posted the transaction. | Places the transaction in time windows used by velocity rules. |
accountHolder | Your customer or GL whose account the entry posts to, in either direction. | See the account holder pages. |
counterparty | The other side of the transaction. | See the counterparty pages. counterpartyType and that type's name field are required. |
A minimal request is valid, but it gives rules very little to work with. The pages that follow add the fields rules commonly read.
Formats to get right
- Send amounts as strings, for example
"25000.00". Numbers are accepted but converted to text, and150000,"150000.0"and"150000.00"count as different values when OneView compares a retry with the original request. Amounts allow up to 14 whole digits and 4 decimal places, without leading zeros. - Timestamps are ISO 8601 with
Zor an offset, such as2026-09-21T10:15:00+01:00. OneView stores them in UTC. - Free text such as
narrationmust not contain control characters, including line breaks. - Codes such as
sourceOfFundsandremittancePurposeCodeuse letters, digits,.,_and-, starting with a letter or digit.sourceOfFundscan be up to 64 characters andremittancePurposeCodeup to 32. - References use the
transactionReferencecharacters.transactionReferencecan be up to 64 characters andexternalReferenceup to 128. - Required names and IDs must contain at least one non-space character. A blank
customerUniqueId,accountName,merchantNameorbillerNameis rejected as if it were missing. - The body must be well-formed JSON. A malformed body is rejected with
400 INVALID_JSONbefore the API key is checked. - Unknown top-level fields are rejected. A typo fails immediately instead of being dropped. OneView-assigned
values, such as
transactionId,riskScoreordecision, are also rejected. - Inside
accountHolder,counterpartyandtelemetry, extra keys are stored as sent. Each object can hold up to 64 keys. Values can be strings of up to 512 characters, numbers, booleans,null, or one level of nested object. Arrays and the NUL character (U+0000) are not accepted. For a customer account holder, profile values have their own limits. See Customer account holder.
A rule that reads a key you did not send simply does not match. For example, card velocity rules never fire if you
omit cardFingerprint. Send the keys your institution's rules use.
Choose the account holder and counterparty
Pick the account holder from whose account the entry posts to, then the counterparty from who is on the other side.
| Account holder | Use when | Page |
|---|---|---|
CUSTOMER | The transaction is posted to a customer's account. | Customer account holder |
INTERNAL_GL | The entry posts to one of your own general ledger accounts. | Internal GL account holder |
| Counterparty | Use when | Required name field | Page |
|---|---|---|---|
EXTERNAL_BANK | The other party holds an account at another institution. | accountName | External bank counterparty |
INTERNAL_USER | The other party is another customer of your institution. | accountName | Internal user counterparty |
CARD | A card was used, usually at a merchant. | merchantName | Card counterparty |
VAS | Airtime, data, utility, TV or another biller. | billerName | VAS counterparty |
INTERNAL_GL | Money goes into, or comes from, one of your general ledger accounts. | accountName | Internal GL counterparty |
WALLET | The other party paid from an e-money or mobile money wallet. | None. An identifier is required instead. | Collection channels |
Which counterparty types fit which payment methods and channels
The API does not enforce these pairings. They are the combinations that describe real activity accurately, which is what makes rules scoped by method or channel reliable.
| Counterparty type | Typical paymentMethod | Typical channel |
|---|---|---|
EXTERNAL_BANK | NIP, NEFT, RTGS, SWIFT, CHEQUE, DIRECT_DEBIT, STANDING_ORDER | MOBILE_APP, INTERNET_BANKING, USSD, BRANCH, AGENT_BANKING, API, CORE_BANKING |
INTERNAL_USER | INTERNAL_TRANSFER, STANDING_ORDER, CASH, CHEQUE | MOBILE_APP, INTERNET_BANKING, USSD, BRANCH, AGENT_BANKING, API |
CARD | CARD | POS, ATM, INTERNET_BANKING, API |
VAS | INTERNAL_TRANSFER, CARD | MOBILE_APP, INTERNET_BANKING, USSD, AGENT_BANKING, API |
INTERNAL_GL | INTERNAL_TRANSFER, CASH | CORE_BANKING, BRANCH, ATM |
EXTERNAL_BANK, for a collection | STATIC_ACCOUNT | API, CORE_BANKING |
WALLET | WALLET, MOBILE_MONEY | API, MOBILE_APP, USSD |
Add context
- Collection channels covers static account, wallet and mobile money collections. On a static
account transfer a third party, the collection account, joins the account holder and the counterparty; a wallet or
mobile money collection has only the two.
WALLETis both a payment method and a counterparty type, and the wallet or mobile money provider is identified bycounterparty.institutionCoderather than by the payment method. - Telemetry adds device, IP address and session data to any transaction.
- Decision responses shows every outcome and what your system must do with it.
- Errors lists every error and whether to retry.