Cortex Core Banking API (v1)

Download OpenAPI specification:

Bounded-context REST surface (BIAN-aligned). The contract behind admin-portal src/lib/types.ts.

Beneficiaries

Beneficiary registry for funds transfers. A beneficiary is a saved destination account (internal or external) that a party can reuse across outbound transfers. Reads require transfer:read; creating, updating, activating, deactivating, or deleting a beneficiary requires transfer:operate.

List beneficiaries

Returns all saved beneficiaries. When ownerPartyId is supplied only beneficiaries belonging to that party are returned; omitting it returns the full registry (staff view).

query Parameters
ownerPartyId
string <uuid>

Filter to beneficiaries owned by this party; omit to list all

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Register a beneficiary

Creates a new beneficiary record for a party and returns its generated id (HTTP 201). The beneficiary starts in ACTIVE status and is immediately available for use in transfer instructions. Requires transfer:operate.

Request Body schema: application/json
required
anchor
string
beneficiaryId
required
string <uuid>
frequency
string
name
string
settlementAccountId
required
string <uuid>
settlementDay
integer <int32>
whtTaxClass
string

Responses

Request samples

Content type
application/json
{
  • "anchor": "string",
  • "beneficiaryId": "410e5c37-9603-4e5b-81b1-7cb895f362e8",
  • "frequency": "string",
  • "name": "string",
  • "settlementAccountId": "341894e0-9bf3-408a-9878-bf1204ed5fb2",
  • "settlementDay": 0,
  • "whtTaxClass": "string"
}

Response samples

Content type
application/json
{
  • "property1": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "property2": "497f6eca-6276-4993-bfeb-53cbbbba6f08"
}

Delete a beneficiary

Permanently removes a beneficiary from the registry. This is a hard delete — the record cannot be recovered. Pending or historical transfer instructions that referenced this beneficiary are not affected. Returns 204 No Content. Requires transfer:operate.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "error": "string",
  • "fieldErrors": {
    },
  • "message": "string"
}

Update a beneficiary

Replaces the mutable fields of an existing beneficiary (account details, alias, etc.). Returns 204 No Content on success. The beneficiary's status and owner are not changed by this operation. Requires transfer:operate.

path Parameters
id
required
string <uuid>
Request Body schema: application/json
required
anchor
string
beneficiaryId
required
string <uuid>
frequency
string
name
string
settlementAccountId
required
string <uuid>
settlementDay
integer <int32>
whtTaxClass
string

Responses

Request samples

Content type
application/json
{
  • "anchor": "string",
  • "beneficiaryId": "410e5c37-9603-4e5b-81b1-7cb895f362e8",
  • "frequency": "string",
  • "name": "string",
  • "settlementAccountId": "341894e0-9bf3-408a-9878-bf1204ed5fb2",
  • "settlementDay": 0,
  • "whtTaxClass": "string"
}

Response samples

Content type
application/json
{
  • "error": "string",
  • "fieldErrors": {
    },
  • "message": "string"
}

Activate a beneficiary

Returns an INACTIVE beneficiary to ACTIVE status so it can be used in transfer instructions again. Returns 204 No Content. Idempotent-safe if the beneficiary is already active. Requires transfer:operate.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "error": "string",
  • "fieldErrors": {
    },
  • "message": "string"
}

Deactivate a beneficiary

Moves a beneficiary to INACTIVE status so it cannot be used as a transfer destination. Returns 204 No Content. Idempotent-safe if the beneficiary is already inactive. Requires transfer:operate.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "error": "string",
  • "fieldErrors": {
    },
  • "message": "string"
}

Compliance

AML/CFT watchlist management and subject screening. The watchlist holds sanctioned or high-risk party references that trigger alerts during onboarding and transaction processing. Screening runs a subject reference against the active watchlist and records a result that must be disposed (confirmed hit or cleared) by an authorised compliance officer before the related workflow can proceed. No permission model is enforced at this layer — callers are expected to be internal services or staff with appropriate access configured upstream.

List screening results

Returns all screening results, or filters to those for a specific subject reference when subjectRef is supplied. Results include match details and disposition status (PENDING, CONFIRMED_HIT, CLEARED). Useful for compliance dashboards and audit trails.

query Parameters
subjectRef
string

Optional subject reference to filter results; returns all results when omitted

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Screen a subject

Runs the supplied subject reference against all active watchlist entries and records the result. Returns the new ScreeningResultView at HTTP 201, including match details and an initial disposition status of PENDING. The screening result must be disposed (see POST /screenings/{id}/disposition) before the originating workflow can be unblocked.

Request Body schema: application/json
required
name
string
subjectRef
string
threshold
integer <int32>

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "subjectRef": "string",
  • "threshold": 0
}

Response samples

Content type
application/json
{
  • "dispositionNote": "string",
  • "dispositionedAt": "string",
  • "dispositionedBy": "string",
  • "hits": [
    ],
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "passed": true,
  • "screenedAt": "string",
  • "status": "string",
  • "subjectName": "string",
  • "subjectRef": "string",
  • "threshold": 0
}

Get a screening result

Returns a single screening result by its id, including match details and current disposition. Returns 404 if not found.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "dispositionNote": "string",
  • "dispositionedAt": "string",
  • "dispositionedBy": "string",
  • "hits": [
    ],
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "passed": true,
  • "screenedAt": "string",
  • "status": "string",
  • "subjectName": "string",
  • "subjectRef": "string",
  • "threshold": 0
}

Dispose a screening result

Records the compliance officer's disposition decision on a PENDING screening result. When confirmed=true the result transitions to CONFIRMED_HIT (a genuine match, triggering downstream escalation); when confirmed=false it transitions to CLEARED (a false positive, unblocking the originating workflow). The by and note parameters are recorded in the audit trail. Returns the updated ScreeningResultView. Disposing an already-disposed result overwrites the previous decision — intended for correction workflows only.

path Parameters
id
required
string <uuid>
query Parameters
confirmed
required
boolean

true to confirm a genuine watchlist hit; false to clear as a false positive

by
required
string

Identity of the compliance officer recording the disposition

note
string

Optional free-text rationale for the disposition decision

Responses

Response samples

Content type
application/json
{
  • "dispositionNote": "string",
  • "dispositionedAt": "string",
  • "dispositionedBy": "string",
  • "hits": [
    ],
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "passed": true,
  • "screenedAt": "string",
  • "status": "string",
  • "subjectName": "string",
  • "subjectRef": "string",
  • "threshold": 0
}

List watchlist entries

Returns all watchlist entries (both active and deactivated), ordered by creation time.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Add a watchlist entry

Creates a new active watchlist entry for a sanctioned or high-risk subject reference. Returns the persisted entry at HTTP 201. The entry is immediately visible to subsequent screenings — no publish delay. Duplicate entries for the same subject reference are not deduplicated by this endpoint; callers should check the list first if uniqueness matters.

Request Body schema: application/json
required
aliases
Array of strings
country
string
externalRef
string
fullName
required
string non-empty
listType
required
string non-empty
source
string

Responses

Request samples

Content type
application/json
{
  • "aliases": [
    ],
  • "country": "string",
  • "externalRef": "string",
  • "fullName": "string",
  • "listType": "string",
  • "source": "string"
}

Response samples

Content type
application/json
{
  • "active": true,
  • "aliases": [
    ],
  • "country": "string",
  • "externalRef": "string",
  • "fullName": "string",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "listType": "string",
  • "source": "string"
}

Deactivate a watchlist entry

Marks the watchlist entry as inactive so it is no longer matched during future screenings. The entry record is retained for audit purposes. Returns 204 No Content on success. Deactivating an already-inactive entry is a no-op and still returns 204.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "error": "string",
  • "fieldErrors": {
    },
  • "message": "string"
}

Charge Applicability

Manages the set of applicability rules that determine which charges apply to which products, transaction types, or customer segments. Reads are open to authenticated users; creating, replacing, or removing rules requires the pricing:manage authority.

List charge applicability rules

Returns all configured charge applicability rules. No authority required beyond authentication.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create a charge applicability rule

Creates a new applicability rule that links a charge definition to a target scope (product type, transaction type, or segment). Requires pricing:manage authority. Returns the generated rule id. Not idempotent — submitting the same payload twice creates two rules.

Request Body schema: application/json
required
amountFrom
number
amountTo
number
bearerOverride
string
channel
string
chargeCode
required
string non-empty
currency
string
overrideAmount
number
overrideGlPurpose
string
overrideRate
number
overrideTaxClass
string
priority
integer <int32>
productId
string <uuid>
transactionCode
required
string non-empty

Responses

Request samples

Content type
application/json
{
  • "amountFrom": 0,
  • "amountTo": 0,
  • "bearerOverride": "string",
  • "channel": "string",
  • "chargeCode": "string",
  • "currency": "string",
  • "overrideAmount": 0,
  • "overrideGlPurpose": "string",
  • "overrideRate": 0,
  • "overrideTaxClass": "string",
  • "priority": 0,
  • "productId": "dcd53ddb-8104-4e48-8cc0-5df1088c6113",
  • "transactionCode": "string"
}

Response samples

Content type
application/json
{
  • "property1": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "property2": "497f6eca-6276-4993-bfeb-53cbbbba6f08"
}

Delete a charge applicability rule

Permanently removes the applicability rule with the given id. Once deleted, the associated charge will no longer be applied to the previously targeted scope. Requires pricing:manage authority. Returns 204 on success.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "error": "string",
  • "fieldErrors": {
    },
  • "message": "string"
}

Replace a charge applicability rule

Fully replaces an existing applicability rule identified by id. All fields are overwritten from the request body. Requires pricing:manage authority. Returns 204 on success, 404 if the rule does not exist.

path Parameters
id
required
string <uuid>
Request Body schema: application/json
required
amountFrom
number
amountTo
number
bearerOverride
string
channel
string
chargeCode
required
string non-empty
currency
string
overrideAmount
number
overrideGlPurpose
string
overrideRate
number
overrideTaxClass
string
priority
integer <int32>
productId
string <uuid>
transactionCode
required
string non-empty

Responses

Request samples

Content type
application/json
{
  • "amountFrom": 0,
  • "amountTo": 0,
  • "bearerOverride": "string",
  • "channel": "string",
  • "chargeCode": "string",
  • "currency": "string",
  • "overrideAmount": 0,
  • "overrideGlPurpose": "string",
  • "overrideRate": 0,
  • "overrideTaxClass": "string",
  • "priority": 0,
  • "productId": "dcd53ddb-8104-4e48-8cc0-5df1088c6113",
  • "transactionCode": "string"
}

Response samples

Content type
application/json
{
  • "error": "string",
  • "fieldErrors": {
    },
  • "message": "string"
}

Teller

Cash-desk operations: till lifecycle, cash deposits/withdrawals and vault funding (staff/teller). Movements at or below the configured auto-limit post immediately (200 OK with the updated till/vault). Movements above the limit are parked for maker-checker review (202 Accepted with an approvalId); the command is replayed from the approval payload when a checker approves. Reads and basic cash operations require teller:operate; till open/close requires teller:till; vault funding requires teller:vault.

Post a cash deposit

Credits a customer's account and increases the till's cash balance by the deposited amount. If the amount is at or below the auto-approval limit, the deposit posts immediately and the updated till is returned (200 OK). If it exceeds the limit the command is parked for maker-checker review and 202 Accepted is returned with an approvalId — the deposit posts when a checker approves.

Request Body schema: application/json
required
accountId
required
string <uuid>
required
object (MonetaryAmount)

A monetary amount as serialised by Jackson (JSR-354).

beneficiaryId
string <uuid>
narrative
string
tillId
required
string <uuid>

Responses

Request samples

Content type
application/json
{
  • "accountId": "3d07c219-0a88-45be-9cfc-91e9d095a1e9",
  • "amount": {
    },
  • "beneficiaryId": "410e5c37-9603-4e5b-81b1-7cb895f362e8",
  • "narrative": "string",
  • "tillId": "19818646-df1d-4c99-b178-4fe04bb8d522"
}

Response samples

Content type
application/json
{ }

Post a cash withdrawal

Debits a customer's account and decreases the till's cash balance by the withdrawn amount. If the amount is at or below the auto-approval limit, the withdrawal posts immediately and the updated till is returned (200 OK). If it exceeds the limit the command is parked for maker-checker review and 202 Accepted is returned with an approvalId — the withdrawal posts when a checker approves.

Request Body schema: application/json
required
accountId
required
string <uuid>
required
object (MonetaryAmount)

A monetary amount as serialised by Jackson (JSR-354).

beneficiaryId
string <uuid>
narrative
string
tillId
required
string <uuid>

Responses

Request samples

Content type
application/json
{
  • "accountId": "3d07c219-0a88-45be-9cfc-91e9d095a1e9",
  • "amount": {
    },
  • "beneficiaryId": "410e5c37-9603-4e5b-81b1-7cb895f362e8",
  • "narrative": "string",
  • "tillId": "19818646-df1d-4c99-b178-4fe04bb8d522"
}

Response samples

Content type
application/json
{ }

List all tills

Returns all teller tills with their current cash balances and status.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Open a till

Opens a new till for a teller session. The till starts with the opening float declared in the command and transitions to OPEN status. Returns the created till with 201 Created. Requires teller:till authority.

Request Body schema: application/json
required
branchCode
required
string non-empty
required
object (MonetaryAmount)

A monetary amount as serialised by Jackson (JSR-354).

teller
required
string non-empty
tillCode
required
string non-empty

Responses

Request samples

Content type
application/json
{
  • "branchCode": "string",
  • "openingFloat": {
    },
  • "teller": "string",
  • "tillCode": "string"
}

Response samples

Content type
application/json
{
  • "branchCode": "string",
  • "cashBalance": {
    },
  • "currency": "string",
  • "status": "string",
  • "teller": "string",
  • "tillCode": "string",
  • "tillId": "19818646-df1d-4c99-b178-4fe04bb8d522"
}

Get a till by id

Returns the till with its current balance, status and assigned teller, or 404 if not found.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "branchCode": "string",
  • "cashBalance": {
    },
  • "currency": "string",
  • "status": "string",
  • "teller": "string",
  • "tillCode": "string",
  • "tillId": "19818646-df1d-4c99-b178-4fe04bb8d522"
}

Close a till

Closes an OPEN till, finalising the teller session. The till transitions to CLOSED and its closing balance is recorded. Returns the updated till. Requires teller:till authority.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "branchCode": "string",
  • "cashBalance": {
    },
  • "currency": "string",
  • "status": "string",
  • "teller": "string",
  • "tillCode": "string",
  • "tillId": "19818646-df1d-4c99-b178-4fe04bb8d522"
}

List cash movements for a till

Returns all cash movements (deposits and withdrawals) recorded against the specified till, in chronological order.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
[
  • {
    }
]

List all vaults

Returns all branch vaults with their current cash balances.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Fund a vault

Transfers cash into a vault (e.g. from a till or external source), increasing its balance. If the amount is at or below the auto-approval limit, the funding posts immediately and the updated vault list is returned (200 OK). If it exceeds the limit the command is parked for maker-checker review and 202 Accepted is returned with an approvalId — the funding posts when a checker approves. Requires teller:vault authority.

Request Body schema: application/json
required
required
object (MonetaryAmount)

A monetary amount as serialised by Jackson (JSR-354).

branchCode
required
string non-empty

Responses

Request samples

Content type
application/json
{
  • "amount": {
    },
  • "branchCode": "string"
}

Response samples

Content type
application/json
{ }

Card Loans

Revolving card-loan accounts — the billing facility that backs CREDIT cards. Each account carries a credit limit, a current balance, an accrued-interest ledger, and a statement cycle. Payments post immediately and reduce the outstanding balance. Statements are generated at cycle-end and drive minimum-payment obligations. Reads require card:read; all state-changing operations require card:operate.

List all card-loan accounts

Returns every revolving card-loan account with its credit limit, outstanding balance, status, and linked card reference.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Open a card-loan account

Creates a new revolving card-loan account with the supplied credit limit and billing-cycle parameters. The account starts in an OPEN/ACTIVE state and can immediately be linked to a CREDIT card via the card-issuing context. Returns 201 with the newly created account view.

Request Body schema: application/json
required
cardholderPartyId
required
string <uuid>
cashAdvanceApr
number
required
object (MonetaryAmount)

A monetary amount as serialised by Jackson (JSR-354).

cycleDay
integer <int32>
gracePeriodDays
integer <int32>
object (MonetaryAmount)

A monetary amount as serialised by Jackson (JSR-354).

minDuePercent
number
penaltyApr
number
productId
string <uuid>
purchaseApr
number

Responses

Request samples

Content type
application/json
{
  • "cardholderPartyId": "1e61b784-773f-41b2-adfe-0a5d2a20fd48",
  • "cashAdvanceApr": 0,
  • "creditLimit": {
    },
  • "cycleDay": 0,
  • "gracePeriodDays": 0,
  • "minDueFloor": {
    },
  • "minDuePercent": 0,
  • "penaltyApr": 0,
  • "productId": "dcd53ddb-8104-4e48-8cc0-5df1088c6113",
  • "purchaseApr": 0
}

Response samples

Content type
application/json
{
  • "accruedInterest": {
    },
  • "availableCredit": {
    },
  • "cardholderPartyId": "1e61b784-773f-41b2-adfe-0a5d2a20fd48",
  • "cashAdvanceBalance": {
    },
  • "creditLimit": {
    },
  • "currency": "string",
  • "currentBalance": {
    },
  • "delinquencyBucket": "string",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "minimumDue": {
    },
  • "paidInFullLastCycle": true,
  • "paymentDueDate": "string",
  • "penaltyBalance": {
    },
  • "purchaseBalance": {
    },
  • "reference": "string",
  • "stage": 0,
  • "statementBalance": {
    },
  • "status": "string"
}

Get a card-loan account by id

Returns one card-loan account, or 404 if no account has that id.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "accruedInterest": {
    },
  • "availableCredit": {
    },
  • "cardholderPartyId": "1e61b784-773f-41b2-adfe-0a5d2a20fd48",
  • "cashAdvanceBalance": {
    },
  • "creditLimit": {
    },
  • "currency": "string",
  • "currentBalance": {
    },
  • "delinquencyBucket": "string",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "minimumDue": {
    },
  • "paidInFullLastCycle": true,
  • "paymentDueDate": "string",
  • "penaltyBalance": {
    },
  • "purchaseBalance": {
    },
  • "reference": "string",
  • "stage": 0,
  • "statementBalance": {
    },
  • "status": "string"
}

Block a card-loan account

Suspends the account so the linked card declines all authorizations (lost/stolen/fraud/risk hold). The balance and statements remain intact; payments can still be received.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "accruedInterest": {
    },
  • "availableCredit": {
    },
  • "cardholderPartyId": "1e61b784-773f-41b2-adfe-0a5d2a20fd48",
  • "cashAdvanceBalance": {
    },
  • "creditLimit": {
    },
  • "currency": "string",
  • "currentBalance": {
    },
  • "delinquencyBucket": "string",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "minimumDue": {
    },
  • "paidInFullLastCycle": true,
  • "paymentDueDate": "string",
  • "penaltyBalance": {
    },
  • "purchaseBalance": {
    },
  • "reference": "string",
  • "stage": 0,
  • "statementBalance": {
    },
  • "status": "string"
}

Close a card-loan account

Permanently closes the card-loan account (terminal state). The outstanding balance must be settled separately; a closed account cannot be reopened. The linked card is also expected to be closed via the card-issuing context.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "accruedInterest": {
    },
  • "availableCredit": {
    },
  • "cardholderPartyId": "1e61b784-773f-41b2-adfe-0a5d2a20fd48",
  • "cashAdvanceBalance": {
    },
  • "creditLimit": {
    },
  • "currency": "string",
  • "currentBalance": {
    },
  • "delinquencyBucket": "string",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "minimumDue": {
    },
  • "paidInFullLastCycle": true,
  • "paymentDueDate": "string",
  • "penaltyBalance": {
    },
  • "purchaseBalance": {
    },
  • "reference": "string",
  • "stage": 0,
  • "statementBalance": {
    },
  • "status": "string"
}

Set credit limit

Replaces the credit limit on the card-loan account. If the new limit is lower than the current outstanding balance, the account becomes over-limit but no forced repayment is triggered — subsequent authorizations on the linked card will decline until the balance is brought within the new limit.

path Parameters
id
required
string <uuid>
Request Body schema: application/json
required
additional property
object (MonetaryAmount)

A monetary amount as serialised by Jackson (JSR-354).

Responses

Request samples

Content type
application/json
{
  • "property1": {
    },
  • "property2": {
    }
}

Response samples

Content type
application/json
{
  • "accruedInterest": {
    },
  • "availableCredit": {
    },
  • "cardholderPartyId": "1e61b784-773f-41b2-adfe-0a5d2a20fd48",
  • "cashAdvanceBalance": {
    },
  • "creditLimit": {
    },
  • "currency": "string",
  • "currentBalance": {
    },
  • "delinquencyBucket": "string",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "minimumDue": {
    },
  • "paidInFullLastCycle": true,
  • "paymentDueDate": "string",
  • "penaltyBalance": {
    },
  • "purchaseBalance": {
    },
  • "reference": "string",
  • "stage": 0,
  • "statementBalance": {
    },
  • "status": "string"
}

Post a card payment

Applies a customer payment to the card-loan account, reducing the outstanding balance. The payment is posted immediately as a credit entry on the billing ledger. Overpayments are allowed and result in a credit balance. Partial payments reduce the balance without clearing the full amount due.

path Parameters
id
required
string <uuid>
Request Body schema: application/json
required
required
object (MonetaryAmount)

A monetary amount as serialised by Jackson (JSR-354).

fromDepositAccountId
required
string <uuid>

Responses

Request samples

Content type
application/json
{
  • "amount": {
    },
  • "fromDepositAccountId": "1b7c4a5f-1f31-4b73-ad90-6fd138b5ea95"
}

Response samples

Content type
application/json
{
  • "accruedInterest": {
    },
  • "availableCredit": {
    },
  • "cardholderPartyId": "1e61b784-773f-41b2-adfe-0a5d2a20fd48",
  • "cashAdvanceBalance": {
    },
  • "creditLimit": {
    },
  • "currency": "string",
  • "currentBalance": {
    },
  • "delinquencyBucket": "string",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "minimumDue": {
    },
  • "paidInFullLastCycle": true,
  • "paymentDueDate": "string",
  • "penaltyBalance": {
    },
  • "purchaseBalance": {
    },
  • "reference": "string",
  • "stage": 0,
  • "statementBalance": {
    },
  • "status": "string"
}

List statements for an account

Returns all billing statements generated for the given card-loan account, ordered by statement date. Each statement captures the closing balance, minimum payment due, and due date for that cycle.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Unblock a card-loan account

Lifts a block, returning the account to its prior active state so the linked card can authorize again.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "accruedInterest": {
    },
  • "availableCredit": {
    },
  • "cardholderPartyId": "1e61b784-773f-41b2-adfe-0a5d2a20fd48",
  • "cashAdvanceBalance": {
    },
  • "creditLimit": {
    },
  • "currency": "string",
  • "currentBalance": {
    },
  • "delinquencyBucket": "string",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "minimumDue": {
    },
  • "paidInFullLastCycle": true,
  • "paymentDueDate": "string",
  • "penaltyBalance": {
    },
  • "purchaseBalance": {
    },
  • "reference": "string",
  • "stage": 0,
  • "statementBalance": {
    },
  • "status": "string"
}

Cards

Card issuing, lifecycle and read models (staff/operations). A card's funding type determines where its spend lands: DEBIT → a deposit account, CREDIT → a revolving card-loan line, PREPAID → a stored-value balance. The PAN is never stored — only a surrogate token + last4. Reads require card:read; mutations require card:operate.

List all cards

Returns every issued card with its type, status, funding account and limits.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Issue a card

Issues a card against a funding account and a limit set (single-transaction / daily / ATM caps). The funding account must be a deposit account for DEBIT, a card-loan account for CREDIT, or a prepaid stored-value account for PREPAID. The card starts ISSUED and must be activated before use.

Request Body schema: application/json
required
object (MonetaryAmount)

A monetary amount as serialised by Jackson (JSR-354).

cardholderPartyId
required
string <uuid>
object (MonetaryAmount)

A monetary amount as serialised by Jackson (JSR-354).

expiry
string <date>
fundingAccountId
required
string <uuid>
last4
string
network
string
productId
string <uuid>
object (MonetaryAmount)

A monetary amount as serialised by Jackson (JSR-354).

type
required
string

Responses

Request samples

Content type
application/json
{
  • "atmDailyAmount": {
    },
  • "cardholderPartyId": "1e61b784-773f-41b2-adfe-0a5d2a20fd48",
  • "dailyAmount": {
    },
  • "expiry": "2019-08-24",
  • "fundingAccountId": "2d58f397-b4d9-4f93-90cb-6efb6d145ec8",
  • "last4": "string",
  • "network": "string",
  • "productId": "dcd53ddb-8104-4e48-8cc0-5df1088c6113",
  • "singleTxnCap": {
    },
  • "type": "string"
}

Response samples

Content type
application/json
{
  • "activatedAt": "string",
  • "atmDailyAmount": {
    },
  • "cardToken": "string",
  • "cardholderPartyId": "1e61b784-773f-41b2-adfe-0a5d2a20fd48",
  • "dailyAmount": {
    },
  • "expiry": "string",
  • "fundingAccountId": "2d58f397-b4d9-4f93-90cb-6efb6d145ec8",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "last4": "string",
  • "network": "string",
  • "productId": "dcd53ddb-8104-4e48-8cc0-5df1088c6113",
  • "singleTxnCap": {
    },
  • "status": "string",
  • "type": "string"
}

List authorizations

All card authorizations (memo holds) across cards — PENDING, captured, reversed, expired or declined.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

List settlement batches

Daily netted settlement batches produced by the EOD card-settlement step (scheme-clearing reclass).

Responses

Response samples

Content type
application/json
[
  • {
    }
]

List cleared transactions

All cleared card transactions (the posted side of captures), with their settlement batch once settled.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Get a card by id

Returns one card, or 404 if no card has that id.

path Parameters
id
required
string <uuid>

Card id

Responses

Response samples

Content type
application/json
{
  • "activatedAt": "string",
  • "atmDailyAmount": {
    },
  • "cardToken": "string",
  • "cardholderPartyId": "1e61b784-773f-41b2-adfe-0a5d2a20fd48",
  • "dailyAmount": {
    },
  • "expiry": "string",
  • "fundingAccountId": "2d58f397-b4d9-4f93-90cb-6efb6d145ec8",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "last4": "string",
  • "network": "string",
  • "productId": "dcd53ddb-8104-4e48-8cc0-5df1088c6113",
  • "singleTxnCap": {
    },
  • "status": "string",
  • "type": "string"
}

Activate a card

Moves an ISSUED card to ACTIVATED so it can authorize. Idempotent-safe on an already-active card.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "activatedAt": "string",
  • "atmDailyAmount": {
    },
  • "cardToken": "string",
  • "cardholderPartyId": "1e61b784-773f-41b2-adfe-0a5d2a20fd48",
  • "dailyAmount": {
    },
  • "expiry": "string",
  • "fundingAccountId": "2d58f397-b4d9-4f93-90cb-6efb6d145ec8",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "last4": "string",
  • "network": "string",
  • "productId": "dcd53ddb-8104-4e48-8cc0-5df1088c6113",
  • "singleTxnCap": {
    },
  • "status": "string",
  • "type": "string"
}

Block a card

Suspends an active card (lost/stolen/fraud/risk). Blocked cards decline all authorizations until unblocked.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "activatedAt": "string",
  • "atmDailyAmount": {
    },
  • "cardToken": "string",
  • "cardholderPartyId": "1e61b784-773f-41b2-adfe-0a5d2a20fd48",
  • "dailyAmount": {
    },
  • "expiry": "string",
  • "fundingAccountId": "2d58f397-b4d9-4f93-90cb-6efb6d145ec8",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "last4": "string",
  • "network": "string",
  • "productId": "dcd53ddb-8104-4e48-8cc0-5df1088c6113",
  • "singleTxnCap": {
    },
  • "status": "string",
  • "type": "string"
}

Close a card

Permanently closes a card (terminal state). A closed card cannot be reactivated.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "activatedAt": "string",
  • "atmDailyAmount": {
    },
  • "cardToken": "string",
  • "cardholderPartyId": "1e61b784-773f-41b2-adfe-0a5d2a20fd48",
  • "dailyAmount": {
    },
  • "expiry": "string",
  • "fundingAccountId": "2d58f397-b4d9-4f93-90cb-6efb6d145ec8",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "last4": "string",
  • "network": "string",
  • "productId": "dcd53ddb-8104-4e48-8cc0-5df1088c6113",
  • "singleTxnCap": {
    },
  • "status": "string",
  • "type": "string"
}

Update card limits

Replaces the card's limit set — single-transaction cap, daily amount cap, and ATM daily cap — applied on the next authorization.

path Parameters
id
required
string <uuid>
Request Body schema: application/json
required
object (MonetaryAmount)

A monetary amount as serialised by Jackson (JSR-354).

object (MonetaryAmount)

A monetary amount as serialised by Jackson (JSR-354).

object (MonetaryAmount)

A monetary amount as serialised by Jackson (JSR-354).

Responses

Request samples

Content type
application/json
{
  • "atmDailyAmount": {
    },
  • "dailyAmount": {
    },
  • "singleTxnCap": {
    }
}

Response samples

Content type
application/json
{
  • "activatedAt": "string",
  • "atmDailyAmount": {
    },
  • "cardToken": "string",
  • "cardholderPartyId": "1e61b784-773f-41b2-adfe-0a5d2a20fd48",
  • "dailyAmount": {
    },
  • "expiry": "string",
  • "fundingAccountId": "2d58f397-b4d9-4f93-90cb-6efb6d145ec8",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "last4": "string",
  • "network": "string",
  • "productId": "dcd53ddb-8104-4e48-8cc0-5df1088c6113",
  • "singleTxnCap": {
    },
  • "status": "string",
  • "type": "string"
}

Unblock a card

Returns a BLOCKED card to ACTIVATED so it can authorize again.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "activatedAt": "string",
  • "atmDailyAmount": {
    },
  • "cardToken": "string",
  • "cardholderPartyId": "1e61b784-773f-41b2-adfe-0a5d2a20fd48",
  • "dailyAmount": {
    },
  • "expiry": "string",
  • "fundingAccountId": "2d58f397-b4d9-4f93-90cb-6efb6d145ec8",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "last4": "string",
  • "network": "string",
  • "productId": "dcd53ddb-8104-4e48-8cc0-5df1088c6113",
  • "singleTxnCap": {
    },
  • "status": "string",
  • "type": "string"
}

AML Cases

Anti-Money Laundering (AML) case management — creation, investigation lifecycle and closure. Cases are raised against a party and linked to one or more alert identifiers. A case moves through OPEN → INVESTIGATING → CLOSED. Reads require aml:read; all state-mutating operations require aml:operate.

List all AML cases

Returns every AML case regardless of status, ordered by creation time descending.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Open an AML case

Creates a new AML case in OPEN status for the given party, linked to the supplied alert ids. The partyId must reference an existing CIF party. At least one alertId is expected but not enforced at the API layer. Returns 201 with the newly created CaseView.

Request Body schema: application/json
required
property name*
additional property
any

Responses

Request samples

Content type
application/json
{
  • "property1": null,
  • "property2": null
}

Response samples

Content type
application/json
{
  • "alertIds": [
    ],
  • "caseId": "af51d69f-996a-4891-a745-aadfcdec225a",
  • "createdAt": "string",
  • "notes": "string",
  • "outcome": "string",
  • "partyId": "950a3d1f-4657-4e7b-87db-3ff5fa95b5c0",
  • "reference": "string",
  • "status": "string"
}

Get an AML case by id

Returns one AML case with its linked alert ids and current status, or 404 if not found.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "alertIds": [
    ],
  • "caseId": "af51d69f-996a-4891-a745-aadfcdec225a",
  • "createdAt": "string",
  • "notes": "string",
  • "outcome": "string",
  • "partyId": "950a3d1f-4657-4e7b-87db-3ff5fa95b5c0",
  • "reference": "string",
  • "status": "string"
}

Close an AML case

Closes an OPEN or INVESTIGATING case (terminal state). Requires an outcome (e.g. SAR_FILED, NO_ACTION, FALSE_POSITIVE) and optional closure notes. A closed case cannot be re-opened. Returns 204 No Content on success.

path Parameters
id
required
string <uuid>
Request Body schema: application/json
required
property name*
additional property
string

Responses

Request samples

Content type
application/json
{
  • "property1": "string",
  • "property2": "string"
}

Response samples

Content type
application/json
{
  • "error": "string",
  • "fieldErrors": {
    },
  • "message": "string"
}

Move a case to investigating

Transitions an OPEN case to INVESTIGATING status, recording optional investigator notes. The request body is optional; if supplied, the notes field is persisted against the case. Returns 204 No Content on success.

path Parameters
id
required
string <uuid>
Request Body schema: application/json
property name*
additional property
string

Responses

Request samples

Content type
application/json
{
  • "property1": "string",
  • "property2": "string"
}

Response samples

Content type
application/json
{
  • "error": "string",
  • "fieldErrors": {
    },
  • "message": "string"
}

Clearing

Cheque and payment-instrument clearing: outward items (bank presents to clearing house), inward items (clearing house delivers to bank), clearing sessions, net settlement positions, and clearing house registry. Covers the full item lifecycle — PENDING → CLEARED / RETURNED — plus end-of-day net settlement finalisation per house and business date. Reads require clearing:read; all state-changing operations require clearing:operate.

Get clearing float for an account

Returns the uncleared (float) balance for the given account — the total value of outward items that have been entered but not yet cleared or returned. Float represents funds not yet available for value-dating.

path Parameters
accountId
required
string <uuid>

Deposit account whose uncleared float is being queried

Responses

Response samples

Content type
application/json
{
  • "property1": {
    },
  • "property2": {
    }
}

List clearing houses

Returns all registered clearing houses (e.g. CTS, RTGS) with their scheme and float-day configuration.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create or update a clearing house

Upserts a clearing house record by code. If a house with that code already exists its name, scheme, and float-day configuration are updated; otherwise a new house is created. Body fields: code (required), name (required), scheme (default CTS), floatDays (default 2). Requires clearing:operate.

Request Body schema: application/json
required
property name*
additional property
any

Responses

Request samples

Content type
application/json
{
  • "property1": null,
  • "property2": null
}

Response samples

Content type
application/json
{
  • "active": true,
  • "code": "string",
  • "floatDays": 0,
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "name": "string",
  • "scheme": "string"
}

List all clearing items

Returns every clearing item (outward and inward) regardless of status or session.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Receive an inward clearing item

Records a new inward clearing item — an instrument received from the clearing house drawn on this bank's customer. The item starts in PENDING status awaiting a pay or return decision before the session closes. Requires clearing:operate.

Request Body schema: application/json
required
required
object (MonetaryAmount)

A monetary amount as serialised by Jackson (JSR-354).

clearingHouseCode
string
customerAccountId
required
string <uuid>
drawerBank
string
idempotencyKey
string
instrumentType
string
serial
string

Responses

Request samples

Content type
application/json
{
  • "amount": {
    },
  • "clearingHouseCode": "string",
  • "customerAccountId": "d8c60791-7301-441c-98e8-5bea9a162d9b",
  • "drawerBank": "string",
  • "idempotencyKey": "string",
  • "instrumentType": "string",
  • "serial": "string"
}

Response samples

Content type
application/json
{
  • "amount": {
    },
  • "customerAccountId": "d8c60791-7301-441c-98e8-5bea9a162d9b",
  • "direction": "string",
  • "drawerBank": "string",
  • "holdId": "05363803-5510-4d71-8d1f-307021f9ad73",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "instrumentType": "string",
  • "presentmentDate": "string",
  • "reference": "string",
  • "returnReasonCode": "string",
  • "serial": "string",
  • "sessionId": "f6567dd8-e069-418e-8893-7d22fcf12459",
  • "state": "string",
  • "valueDate": "string"
}

Enter an outward clearing item

Records a new outward clearing item — an instrument (e.g. cheque) presented by this bank to the clearing house for collection from a drawee bank. The item starts in PENDING status and is held as float against the presenting account until cleared or returned. Requires clearing:operate.

Request Body schema: application/json
required
required
object (MonetaryAmount)

A monetary amount as serialised by Jackson (JSR-354).

clearingHouseCode
string
customerAccountId
required
string <uuid>
drawerBank
string
idempotencyKey
string
instrumentType
string
serial
string

Responses

Request samples

Content type
application/json
{
  • "amount": {
    },
  • "clearingHouseCode": "string",
  • "customerAccountId": "d8c60791-7301-441c-98e8-5bea9a162d9b",
  • "drawerBank": "string",
  • "idempotencyKey": "string",
  • "instrumentType": "string",
  • "serial": "string"
}

Response samples

Content type
application/json
{
  • "amount": {
    },
  • "customerAccountId": "d8c60791-7301-441c-98e8-5bea9a162d9b",
  • "direction": "string",
  • "drawerBank": "string",
  • "holdId": "05363803-5510-4d71-8d1f-307021f9ad73",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "instrumentType": "string",
  • "presentmentDate": "string",
  • "reference": "string",
  • "returnReasonCode": "string",
  • "serial": "string",
  • "sessionId": "f6567dd8-e069-418e-8893-7d22fcf12459",
  • "state": "string",
  • "valueDate": "string"
}

Get a clearing item by id

Returns a single clearing item, or 404 if no item exists with that id.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "amount": {
    },
  • "customerAccountId": "d8c60791-7301-441c-98e8-5bea9a162d9b",
  • "direction": "string",
  • "drawerBank": "string",
  • "holdId": "05363803-5510-4d71-8d1f-307021f9ad73",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "instrumentType": "string",
  • "presentmentDate": "string",
  • "reference": "string",
  • "returnReasonCode": "string",
  • "serial": "string",
  • "sessionId": "f6567dd8-e069-418e-8893-7d22fcf12459",
  • "state": "string",
  • "valueDate": "string"
}

Clear an outward item

Marks an outward item as CLEARED — the drawee bank has honoured it. This transitions the item from float to a realised credit on the presenting account. Requires clearing:operate.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "error": "string",
  • "fieldErrors": {
    },
  • "message": "string"
}

Pay an inward item

Approves and pays a pending inward item — debits the drawee's account and marks the item CLEARED. The debit posting is created as a side effect. Must be called before the clearing session closes. Requires clearing:operate.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "error": "string",
  • "fieldErrors": {
    },
  • "message": "string"
}

Return an outward item

Marks an outward item as RETURNED with a reason code (e.g. REFER_TO_DRAWER, ACCOUNT_CLOSED). The float held against the presenting account is released without a credit. Body: { "reasonCode": "" } — defaults to UNSPECIFIED if omitted. Requires clearing:operate.

path Parameters
id
required
string <uuid>
Request Body schema: application/json
required
property name*
additional property
string

Responses

Request samples

Content type
application/json
{
  • "property1": "string",
  • "property2": "string"
}

Response samples

Content type
application/json
{
  • "error": "string",
  • "fieldErrors": {
    },
  • "message": "string"
}

Return an inward item

Dishonours a pending inward item and sends it back to the clearing house with a reason code (e.g. INSUFFICIENT_FUNDS, SIGNATURE_IRREGULAR). No debit is posted; the item is marked RETURNED. Body: { "reasonCode": "" } — defaults to UNSPECIFIED if omitted. Requires clearing:operate.

path Parameters
id
required
string <uuid>
Request Body schema: application/json
required
property name*
additional property
string

Responses

Request samples

Content type
application/json
{
  • "property1": "string",
  • "property2": "string"
}

Response samples

Content type
application/json
{
  • "error": "string",
  • "fieldErrors": {
    },
  • "message": "string"
}

List clearing sessions

Returns all clearing sessions, each representing one exchange cycle with a clearing house.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Finalise net settlement for a clearing house

Runs end-of-day net settlement for the specified clearing house and business date. Aggregates all cleared items to produce a net position (debit or credit against the settlement account) and records a SettlementPosition. Should be called once per house per business day after all items are cleared or returned. Query params: house (clearing house code), businessDate (ISO-8601 date, e.g. 2026-06-30). Requires clearing:operate.

query Parameters
house
required
string

Clearing house code (e.g. CTS, RTGS)

businessDate
required
string

ISO-8601 business date for which settlement is finalised (e.g. 2026-06-30)

Responses

Response samples

Content type
application/json
{
  • "currency": "string",
  • "finality": "string",
  • "grossCredits": {
    },
  • "grossDebits": {
    },
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "netAmount": {
    },
  • "sessionId": "f6567dd8-e069-418e-8893-7d22fcf12459",
  • "settledAt": "string",
  • "settledEntryId": "5925a7fa-1244-40be-88e7-6acab8cdfae9"
}

List net settlement positions

Returns the bank's net settlement positions across all clearing houses and business dates, covering both finalized and pending settlements.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Commissions

Commission and fee-structure catalogue used by the pricing engine when calculating charges on transactions, loans, and other products. Each commission is identified by a unique code and carries rate/amount rules that the pricing engine resolves at charge time. Reads are open to authenticated users; create, update, activate and deactivate require the pricing:manage authority.

List all commissions

Returns every commission definition in the catalogue, regardless of status.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create a commission

Creates a new commission definition and returns it as ACTIVE. The commission code must be unique across the catalogue; submitting a duplicate code is a validation error. Requires pricing:manage authority.

Request Body schema: application/json
required
amount
number
base
string
beneficiaryType
string
category
string
commissionCode
required
string non-empty
expenseGlCode
required
string non-empty
maxAmount
number
method
required
string non-empty
minAmount
number
name
required
string non-empty
payableGlCode
required
string non-empty
rate
number

Responses

Request samples

Content type
application/json
{
  • "amount": 0,
  • "base": "string",
  • "beneficiaryType": "string",
  • "category": "string",
  • "commissionCode": "string",
  • "expenseGlCode": "string",
  • "maxAmount": 0,
  • "method": "string",
  • "minAmount": 0,
  • "name": "string",
  • "payableGlCode": "string",
  • "rate": 0
}

Response samples

Content type
application/json
{
  • "active": true,
  • "amount": 0,
  • "base": "string",
  • "beneficiaryType": "string",
  • "category": "string",
  • "commissionCode": "string",
  • "expenseGlCode": "string",
  • "maxAmount": 0,
  • "method": "string",
  • "minAmount": 0,
  • "name": "string",
  • "payableGlCode": "string",
  • "rate": 0
}

Get a commission by code

Returns the commission definition identified by the given code, or 404 if no such commission exists.

path Parameters
code
required
string

Unique commission code (e.g. TRANSFER_FEE)

Responses

Response samples

Content type
application/json
{
  • "active": true,
  • "amount": 0,
  • "base": "string",
  • "beneficiaryType": "string",
  • "category": "string",
  • "commissionCode": "string",
  • "expenseGlCode": "string",
  • "maxAmount": 0,
  • "method": "string",
  • "minAmount": 0,
  • "name": "string",
  • "payableGlCode": "string",
  • "rate": 0
}

Update a commission

Replaces all mutable fields of the commission identified by code (rate, amount rules, description, etc.). The code itself is immutable. Changes take effect on the next pricing-engine resolution; in-flight charges already computed are not retroactively affected. Returns the updated commission view. Requires pricing:manage authority.

path Parameters
code
required
string

Unique commission code to update

Request Body schema: application/json
required
amount
number
base
string
beneficiaryType
string
category
string
commissionCode
required
string non-empty
expenseGlCode
required
string non-empty
maxAmount
number
method
required
string non-empty
minAmount
number
name
required
string non-empty
payableGlCode
required
string non-empty
rate
number

Responses

Request samples

Content type
application/json
{
  • "amount": 0,
  • "base": "string",
  • "beneficiaryType": "string",
  • "category": "string",
  • "commissionCode": "string",
  • "expenseGlCode": "string",
  • "maxAmount": 0,
  • "method": "string",
  • "minAmount": 0,
  • "name": "string",
  • "payableGlCode": "string",
  • "rate": 0
}

Response samples

Content type
application/json
{
  • "active": true,
  • "amount": 0,
  • "base": "string",
  • "beneficiaryType": "string",
  • "category": "string",
  • "commissionCode": "string",
  • "expenseGlCode": "string",
  • "maxAmount": 0,
  • "method": "string",
  • "minAmount": 0,
  • "name": "string",
  • "payableGlCode": "string",
  • "rate": 0
}

Activate a commission

Returns an INACTIVE commission to ACTIVE status so it is again eligible for pricing-engine resolution. Idempotent-safe when the commission is already active. Requires pricing:manage authority.

path Parameters
code
required
string

Unique commission code to activate

Responses

Response samples

Content type
application/json
{
  • "active": true,
  • "amount": 0,
  • "base": "string",
  • "beneficiaryType": "string",
  • "category": "string",
  • "commissionCode": "string",
  • "expenseGlCode": "string",
  • "maxAmount": 0,
  • "method": "string",
  • "minAmount": 0,
  • "name": "string",
  • "payableGlCode": "string",
  • "rate": 0
}

Deactivate a commission

Transitions the commission to INACTIVE status. An inactive commission is excluded from pricing-engine resolution so new charges will not reference it. Already-posted charges that referenced this commission are unaffected. Requires pricing:manage authority.

path Parameters
code
required
string

Unique commission code to deactivate

Responses

Response samples

Content type
application/json
{
  • "active": true,
  • "amount": 0,
  • "base": "string",
  • "beneficiaryType": "string",
  • "category": "string",
  • "commissionCode": "string",
  • "expenseGlCode": "string",
  • "maxAmount": 0,
  • "method": "string",
  • "minAmount": 0,
  • "name": "string",
  • "payableGlCode": "string",
  • "rate": 0
}

Branches

Branch master — bank-wide reference data identifying physical and virtual branches. Branches are referenced by parties, accounts, and loans but are not scoped to those entities; any authenticated staff member may read the directory (needed to resolve branch names for display). Creating, renaming, or deactivating a branch requires the reference:manage authority.

List all branches

Returns every branch in the bank's directory (active and inactive), ordered by code. No pagination — the branch list is expected to be small.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create a branch

Creates a new branch with the supplied code and name. The branch id is server-assigned and returned in the 201 response body. Requires reference:manage. The code must be unique across the branch directory; duplicate codes will be rejected.

Request Body schema: application/json
required
code
required
string non-empty
name
required
string non-empty

Responses

Request samples

Content type
application/json
{
  • "code": "string",
  • "name": "string"
}

Response samples

Content type
application/json
{
  • "branchId": "712f308d-801e-48bc-b072-9c404734ceb7",
  • "code": "string",
  • "name": "string",
  • "status": "string"
}

Get a branch by id

Returns a single branch by its UUID, or 404 if no branch with that id exists.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "branchId": "712f308d-801e-48bc-b072-9c404734ceb7",
  • "code": "string",
  • "name": "string",
  • "status": "string"
}

Rename a branch

Updates the branch's code and/or display name without changing its id. Because all downstream references (parties, accounts, loans) store the branch id, renaming is safe and does not require cascading updates. Requires reference:manage.

path Parameters
id
required
string <uuid>
Request Body schema: application/json
required
code
required
string non-empty
name
required
string non-empty

Responses

Request samples

Content type
application/json
{
  • "code": "string",
  • "name": "string"
}

Response samples

Content type
application/json
{
  • "branchId": "712f308d-801e-48bc-b072-9c404734ceb7",
  • "code": "string",
  • "name": "string",
  • "status": "string"
}

Deactivate a branch

Marks a branch as inactive so it no longer appears in active-branch lookups or can be assigned to new entities. Existing references to the branch id remain valid. The branch can be inspected but cannot be re-activated via this API. Requires reference:manage.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "branchId": "712f308d-801e-48bc-b072-9c404734ceb7",
  • "code": "string",
  • "name": "string",
  • "status": "string"
}

Notifications

Notification dispatch, template management and per-party channel preferences. The engine sends transactional messages (email, SMS, push, in-app) triggered by domain events or direct API calls. Outbound messages queue in an outbox and are flushed by the dispatch job. Reads require notification:read; all mutations (send, template upsert, preference update, dispatch run) require notification:operate.

List recent notifications

Returns the most recent inbound and outbound notifications across all parties and channels.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Send a notification

Enqueues one or more notifications for the channels specified in the command. Each notification is written to the outbox and will be delivered on the next dispatch run (or immediately if auto-dispatch is enabled). Returns the created notification views including their initial PENDING status.

Request Body schema: application/json
required
category
required
string
correlationRef
string
eventType
required
string
object
partyId
required
string <uuid>

Responses

Request samples

Content type
application/json
{
  • "category": "string",
  • "correlationRef": "string",
  • "eventType": "string",
  • "params": {
    },
  • "partyId": "950a3d1f-4657-4e7b-87db-3ff5fa95b5c0"
}

Response samples

Content type
application/json
[
  • {
    }
]

Run notification dispatch

Triggers an immediate dispatch cycle that attempts to deliver all PENDING outbox notifications via their respective channel adapters (email relay, SMS gateway, push broker, etc.). Returns the number of delivery attempts made. Idempotent — safe to call even when the outbox is empty.

Responses

Response samples

Content type
application/json
{
  • "property1": 0,
  • "property2": 0
}

List outbox notifications

Returns notifications that are pending dispatch — queued in the outbox but not yet delivered. Use this to inspect the delivery backlog before or after triggering a dispatch run.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Set a notification preference

Creates or replaces a single channel-preference entry for the party identified in the command body. A party's preference determines whether a given event category is delivered over a specific channel (opt-in / opt-out). Returns the full updated preference list for that party after the change is applied.

Request Body schema: application/json
required
category
required
string
channel
required
string
enabled
boolean
partyId
required
string <uuid>

Responses

Request samples

Content type
application/json
{
  • "category": "string",
  • "channel": "string",
  • "enabled": true,
  • "partyId": "950a3d1f-4657-4e7b-87db-3ff5fa95b5c0"
}

Response samples

Content type
application/json
[
  • {
    }
]

Get channel preferences for a party

Returns all notification channel preferences registered for the given party — which channels (email, SMS, push) are opted in or out per event category.

path Parameters
partyId
required
string <uuid>

Party (customer or staff member) whose preferences to retrieve

Responses

Response samples

Content type
application/json
[
  • {
    }
]

List notification templates

Returns all registered notification templates across channels and event types.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create or update a notification template

Upserts a notification template identified by its channel and event-type key. If a template with that key already exists it is overwritten; otherwise a new one is created. Templates define the subject and body (with variable placeholders) used when rendering outbound messages for matching events.

Request Body schema: application/json
required
active
boolean
body
required
string non-empty
category
required
string non-empty
channel
required
string non-empty
code
required
string non-empty
eventType
required
string non-empty
locale
string
subject
string

Responses

Request samples

Content type
application/json
{
  • "active": true,
  • "body": "string",
  • "category": "string",
  • "channel": "string",
  • "code": "string",
  • "eventType": "string",
  • "locale": "string",
  • "subject": "string"
}

Response samples

Content type
application/json
{
  • "active": true,
  • "body": "string",
  • "category": "string",
  • "channel": "string",
  • "code": "string",
  • "eventType": "string",
  • "locale": "string",
  • "subject": "string"
}

Reporting

Financial reporting read models aggregated from the Ledger and Deposits contexts (staff/finance/compliance). All endpoints are read-only and require the reporting:read authority. Reports are single-currency by default (omitting the currency param uses the institution base currency); pass consolidated=true on endpoints that support it to translate every posting currency into the base via mid-market FX rates.

Get balance sheet

Returns the balance sheet (assets, liabilities, equity) for the requested currency. Pass consolidated=true to translate every currency's balances into the institution base at mid-market FX rates, with the FX translation difference recognized in equity; in consolidated mode the currency param is ignored. Omit currency (and consolidated=false) to default to the base currency. Read-only; no state transitions or side effects.

query Parameters
currency
string

ISO 4217 currency code; omit to use the institution base currency (ignored when consolidated=true)

consolidated
boolean
Default: false

Responses

Response samples

Content type
application/json
{
  • "assets": [
    ],
  • "balanced": true,
  • "equity": [
    ],
  • "liabilities": [
    ],
  • "totalAssets": {
    },
  • "totalEquity": {
    },
  • "totalLiabilities": {
    }
}

Get base currency and available reporting currencies

Returns the institution's base/reporting currency and the list of distinct currencies that have ledger postings, suitable for populating a reporting currency selector in the UI.

Responses

Response samples

Content type
application/json
{
  • "property1": null,
  • "property2": null
}

Get deposit balances

Returns balances for all deposit accounts aggregated from the Deposits context. Figures are in each account's own currency; no cross-currency consolidation is applied. Read-only; no state transitions or side effects.

Responses

Response samples

Content type
application/json
{
  • "currencies": [
    ]
}

Get profit and loss statement

Returns the income statement (revenue, expenses, net profit/loss) for the requested currency. Pass consolidated=true to translate every currency's P&L into the institution base at mid-market FX rates; in consolidated mode the currency param is ignored. Omit currency (and consolidated=false) to default to the base currency. Read-only; no state transitions or side effects.

query Parameters
currency
string

ISO 4217 currency code; omit to use the institution base currency (ignored when consolidated=true)

consolidated
boolean
Default: false

Responses

Response samples

Content type
application/json
{
  • "expense": [
    ],
  • "income": [
    ],
  • "netProfit": {
    },
  • "totalExpense": {
    },
  • "totalIncome": {
    }
}

Get prudential return

Returns the prudential / regulatory return in the base currency: capital adequacy ratios, liquidity metrics, and the largest single-counterparty exposure. Figures are always in the institution base currency regardless of multi-currency postings. Read-only; no state transitions or side effects.

Responses

Response samples

Content type
application/json
{
  • "baseCurrency": "string",
  • "capital": {
    },
  • "capitalAdequacyRatioPct": 0,
  • "largestExposure": {
    },
  • "largestExposureRatioPct": 0,
  • "liquidAssets": {
    },
  • "liquidityRatioPct": 0,
  • "riskWeightedAssets": {
    },
  • "totalLiabilities": {
    }
}

Get trial balance

Returns the trial balance (debit and credit totals per account) for the requested currency. Balances are never summed across currencies — omit currency to default to the institution base. Read-only; no state transitions or side effects.

query Parameters
currency
string

ISO 4217 currency code; omit to use the institution base currency

Responses

Response samples

Content type
application/json
{
  • "balanced": true,
  • "lines": [
    ],
  • "totalCredits": {
    },
  • "totalDebits": {
    }
}

Retail Banking

Customer-facing BFF aggregating accounts, loans, cards, disputes, prepaid, payments and preferences for the authenticated retail customer. Every response is scoped to the session party — no customer can access another customer's data. The BFF delegates mutations to the owning domain use cases (which re-validate entitlements server-side); money-movement endpoints additionally require a valid SCA step-up token on the session.

List own accounts

Returns summary views of all deposit accounts for which the authenticated customer holds a mandate.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Get account detail

Returns the full account detail including mandates and balances. Throws 403 if the account is not owned by the session customer.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "accountId": "3d07c219-0a88-45be-9cfc-91e9d095a1e9",
  • "accountNumber": "string",
  • "accruedInterest": {
    },
  • "available": {
    },
  • "balance": {
    },
  • "branchId": "712f308d-801e-48bc-b072-9c404734ceb7",
  • "currency": "string",
  • "holdTotal": {
    },
  • "holds": [
    ],
  • "mandates": [
    ],
  • "overdraftLimit": {
    },
  • "productId": "dcd53ddb-8104-4e48-8cc0-5df1088c6113",
  • "status": "string",
  • "title": "string"
}

Get account statement

Returns a structured statement for the account between the given inclusive date range (ISO-8601 dates). Enforces ownership before querying. No side effects.

path Parameters
id
required
string <uuid>
query Parameters
from
required
string

Start date (inclusive), ISO-8601 format e.g. 2024-01-01

to
required
string

End date (inclusive), ISO-8601 format e.g. 2024-01-31

Responses

Response samples

Content type
application/json
{
  • "accountId": "3d07c219-0a88-45be-9cfc-91e9d095a1e9",
  • "accountNumber": "string",
  • "closingBalance": {
    },
  • "currency": "string",
  • "fromDate": "string",
  • "lines": [
    ],
  • "openingBalance": {
    },
  • "toDate": "string",
  • "totalCredits": {
    },
  • "totalDebits": {
    }
}

List account transactions

Returns all posted transactions for the account. Enforces ownership — throws 403 if the account does not belong to the session customer.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
[
  • {
    }
]

List own beneficiaries

Returns all payment beneficiaries registered by the authenticated customer.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Register a beneficiary

Registers a new payment beneficiary owned by the session customer. The ownerPartyId is always forced to the session party regardless of any value supplied in the request body, preventing cross-customer beneficiary injection. The beneficiary can be an internal account or an external account reachable via a named payment rail.

Request Body schema: application/json
required
anchor
string
beneficiaryId
required
string <uuid>
frequency
string
name
string
settlementAccountId
required
string <uuid>
settlementDay
integer <int32>
whtTaxClass
string

Responses

Request samples

Content type
application/json
{
  • "anchor": "string",
  • "beneficiaryId": "410e5c37-9603-4e5b-81b1-7cb895f362e8",
  • "frequency": "string",
  • "name": "string",
  • "settlementAccountId": "341894e0-9bf3-408a-9878-bf1204ed5fb2",
  • "settlementDay": 0,
  • "whtTaxClass": "string"
}

Response samples

Content type
application/json
{
  • "property1": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "property2": "497f6eca-6276-4993-bfeb-53cbbbba6f08"
}

List own credit card accounts

Returns all revolving card-loan (credit card) accounts for which the session customer is the cardholder.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Make a credit card payment

Applies a payment from one of the customer's own deposit accounts to a credit card account, reducing the outstanding balance. Both the card-loan account and the source deposit account must be owned by the session customer. The payment is processed by the card-billing domain which posts the debit to the deposit account and credits the card-loan balance.

path Parameters
id
required
string <uuid>
Request Body schema: application/json
required
property name*
additional property
any

Responses

Request samples

Content type
application/json
{
  • "property1": null,
  • "property2": null
}

Response samples

Content type
application/json
{
  • "accruedInterest": {
    },
  • "availableCredit": {
    },
  • "cardholderPartyId": "1e61b784-773f-41b2-adfe-0a5d2a20fd48",
  • "cashAdvanceBalance": {
    },
  • "creditLimit": {
    },
  • "currency": "string",
  • "currentBalance": {
    },
  • "delinquencyBucket": "string",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "minimumDue": {
    },
  • "paidInFullLastCycle": true,
  • "paymentDueDate": "string",
  • "penaltyBalance": {
    },
  • "purchaseBalance": {
    },
  • "reference": "string",
  • "stage": 0,
  • "statementBalance": {
    },
  • "status": "string"
}

List statements for a credit card account

Returns all billing cycle statements for the given card-loan account. Ownership is enforced — throws 403 if the account does not belong to the session customer.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
[
  • {
    }
]

List own cards

Returns all cards (debit, credit, prepaid) for which the authenticated customer is the cardholder.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

List own card transactions

Returns all cleared card transactions across every card held by the session customer. Transactions are filtered to only those whose cardId belongs to one of the customer's own cards. Read-only.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Get customer dashboard

Returns an aggregated dashboard payload containing the customer's own deposit accounts with current balances and up to 10 recent notification alerts scoped to their party. This is a read-only aggregation — no state changes occur.

Responses

Response samples

Content type
application/json
{
  • "property1": null,
  • "property2": null
}

List own disputes

Returns all disputes raised by the session customer, across all of their cards.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Raise a card dispute

Opens a dispute for a cleared card transaction. The transaction must belong to one of the session customer's own cards — this entitlement is enforced before the dispute is submitted. The request body must include 'cardTransactionId' (UUID string) and 'reasonCode'; an optional 'note' may be supplied. The dispute is recorded in OPEN state and an audit actor of 'customer:' is stamped on it.

Request Body schema: application/json
required
property name*
additional property
string

Responses

Request samples

Content type
application/json
{
  • "property1": "string",
  • "property2": "string"
}

Response samples

Content type
application/json
{
  • "amount": {
    },
  • "cardId": "f16ba382-eb42-481a-b08f-c57bdc9aae24",
  • "cardTransactionId": "8918d1f2-5fb2-4486-a655-3c16bf91ce29",
  • "cardholderPartyId": "1e61b784-773f-41b2-adfe-0a5d2a20fd48",
  • "category": "string",
  • "events": [
    ],
  • "evidence": [
    ],
  • "filingDeadline": "string",
  • "fundingAccountId": "2d58f397-b4d9-4f93-90cb-6efb6d145ec8",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "openedAt": "string",
  • "outcome": "string",
  • "provisionalCredit": "string",
  • "reasonCode": "string",
  • "reference": "string",
  • "representmentDeadline": "string",
  • "resolvedAmount": {
    },
  • "resolvedAt": "string",
  • "stage": "string"
}

List dispute reason codes

Returns the catalogue of available dispute reason codes that can be referenced when raising a dispute.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

List own loans

Returns all loan facilities for which the authenticated customer is the borrower. Read-only — no state changes.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Get notification preferences

Returns the customer's current notification channel preferences (e.g. SMS/email per event category).

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Set a notification preference

Updates a single notification preference (category + channel + enabled flag) for the session customer, then returns the full updated preference list. The body must include 'category' (string), 'channel' (string), and 'enabled' (boolean).

Request Body schema: application/json
required
property name*
additional property
any

Responses

Request samples

Content type
application/json
{
  • "property1": null,
  • "property2": null
}

Response samples

Content type
application/json
[
  • {
    }
]

Submit an outbound payment

Initiates an outbound payment to an external beneficiary via the specified payment rail (e.g. RTGS, ZIPIT). The debtor account must be owned by the session customer. A valid SCA step-up token is required — the payment is rejected without one. The step-up token is consumed on success, preventing replay. Actual debit postings and rail submission are handled by the Payments hub. The idempotencyKey prevents duplicate submissions on client retries.

Request Body schema: application/json
required
object (MonetaryAmount)

A monetary amount as serialised by Jackson (JSR-354).

beneficiaryAccount
string
beneficiaryName
string
debtorAccountId
string <uuid>
idempotencyKey
string
narrative
string
rail
string

Responses

Request samples

Content type
application/json
{
  • "amount": {
    },
  • "beneficiaryAccount": "string",
  • "beneficiaryName": "string",
  • "debtorAccountId": "d9695c4c-f4a8-4c4e-b1b1-0b2201504693",
  • "idempotencyKey": "string",
  • "narrative": "string",
  • "rail": "string"
}

Response samples

Content type
application/json
{
  • "amount": {
    },
  • "beneficiaryAccount": "string",
  • "beneficiaryName": "string",
  • "creditorAccountId": "0411bd28-c6c2-4498-8a47-b18d967449d7",
  • "debtorAccountId": "d9695c4c-f4a8-4c4e-b1b1-0b2201504693",
  • "failureReason": "string",
  • "narrative": "string",
  • "networkRef": "string",
  • "paymentId": "472e651e-5a1e-424d-8098-23858bf03ad7",
  • "rail": "string",
  • "reference": "string",
  • "screeningId": "c70fa460-d553-485e-9f44-b600a5be39b1",
  • "status": "string",
  • "type": "string"
}

List own prepaid accounts

Returns all prepaid (stored-value) accounts for which the session customer is the holder.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

List loads for a prepaid account

Returns the load history (top-up events) for a prepaid account. Ownership is enforced before querying.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Top up a prepaid account

Loads funds onto a prepaid stored-value account by debiting one of the customer's own deposit accounts. Both the prepaid account and the source deposit account must be owned by the session customer. The prepaid domain posts the debit to the deposit account and credits the prepaid balance. Returns the updated prepaid account view after the load.

path Parameters
id
required
string <uuid>
Request Body schema: application/json
required
property name*
additional property
any

Responses

Request samples

Content type
application/json
{
  • "property1": null,
  • "property2": null
}

Response samples

Content type
application/json
{
  • "available": {
    },
  • "balance": {
    },
  • "currency": "string",
  • "expiresAt": "string",
  • "holderPartyId": "88171752-e02f-44db-8743-fff3061b2a46",
  • "holds": {
    },
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "kycTier": "string",
  • "maxBalance": {
    },
  • "programType": "string",
  • "reference": "string",
  • "reloadable": true,
  • "status": "string"
}

Get customer profile

Returns the full party detail record for the authenticated customer (name, contacts, KYC status, addresses).

Responses

Response samples

Content type
application/json
{
  • "addresses": [
    ],
  • "cddTier": "string",
  • "contacts": [
    ],
  • "displayName": "string",
  • "financialProfile": {
    },
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "identifications": [
    ],
  • "kycStatus": "string",
  • "organization": {
    },
  • "partyNumber": "string",
  • "pep": true,
  • "person": {
    },
  • "preferredCurrency": "string",
  • "preferredLanguage": "string",
  • "relationships": [
    ],
  • "riskRating": "string",
  • "segment": "string",
  • "status": "string",
  • "type": "string"
}

List archived statements for account

Returns metadata for all archived (generated) statement documents for the given account. Ownership of the account is enforced before querying.

query Parameters
accountId
required
string <uuid>

The deposit account whose statements to retrieve

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Download a statement document

Streams the binary content of an archived statement document as an attachment. The account linked to the statement must be owned by the session customer; ownership is enforced before the download proceeds. Returns the file with appropriate Content-Disposition and Content-Type headers.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
"string"

Submit an internal transfer

Transfers funds between two internal accounts. The source account must be owned by the session customer. A valid SCA step-up token is required on the session (RetailSession.requireSca()) — the transfer is rejected if no step-up has been performed. The step-up token is consumed on success, preventing replay. The actual debit/credit postings are performed by the Payments hub; this endpoint forwards a typed INTERNAL_TRANSFER command. The idempotencyKey prevents duplicate submissions if the client retries.

Request Body schema: application/json
required
object (MonetaryAmount)

A monetary amount as serialised by Jackson (JSR-354).

beneficiaryName
string
fromAccountId
string <uuid>
idempotencyKey
string
narrative
string
toAccountId
string <uuid>

Responses

Request samples

Content type
application/json
{
  • "amount": {
    },
  • "beneficiaryName": "string",
  • "fromAccountId": "bfc0ca59-4255-47db-ba7f-bed1e37954c5",
  • "idempotencyKey": "string",
  • "narrative": "string",
  • "toAccountId": "a5e9f764-e2f6-4d69-81d7-69120b87b71e"
}

Response samples

Content type
application/json
{
  • "amount": {
    },
  • "beneficiaryAccount": "string",
  • "beneficiaryName": "string",
  • "creditorAccountId": "0411bd28-c6c2-4498-8a47-b18d967449d7",
  • "debtorAccountId": "d9695c4c-f4a8-4c4e-b1b1-0b2201504693",
  • "failureReason": "string",
  • "narrative": "string",
  • "networkRef": "string",
  • "paymentId": "472e651e-5a1e-424d-8098-23858bf03ad7",
  • "rail": "string",
  • "reference": "string",
  • "screeningId": "c70fa460-d553-485e-9f44-b600a5be39b1",
  • "status": "string",
  • "type": "string"
}

Standing Orders

Recurring inter-account transfer instructions that execute automatically on a defined schedule. Each standing order specifies a source account, destination account, amount, frequency, and optional end date. The scheduler picks up due orders and posts the underlying funds-transfer entries. Reads require transfer:read; creation, cancellation, and manual execution require transfer:operate.

List all standing orders

Returns every standing order regardless of status (ACTIVE, CANCELLED, COMPLETED), including schedule, amount, and source/destination accounts.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create a standing order

Creates a new recurring transfer instruction. The order becomes ACTIVE immediately and will be picked up by the next scheduler run that falls on or after the first execution date. The response contains the generated standing-order id.

Request Body schema: application/json
required
required
object (MonetaryAmount)

A monetary amount as serialised by Jackson (JSR-354).

debtorAccountId
required
string <uuid>
endDate
string <date>
firstRunDate
required
string <date>
frequency
required
string
narrative
string
payeeId
required
string <uuid>

Responses

Request samples

Content type
application/json
{
  • "amount": {
    },
  • "debtorAccountId": "d9695c4c-f4a8-4c4e-b1b1-0b2201504693",
  • "endDate": "2019-08-24",
  • "firstRunDate": "2019-08-24",
  • "frequency": "string",
  • "narrative": "string",
  • "payeeId": "79417842-2e1e-4110-a361-89b9f39b36ed"
}

Response samples

Content type
application/json
{
  • "property1": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "property2": "497f6eca-6276-4993-bfeb-53cbbbba6f08"
}

Trigger due standing orders

Manually runs all standing orders whose next execution date is on or before the given date (defaulting to today). For each due order a funds-transfer is posted against the source and destination accounts. Returns the count of orders executed. Useful for end-of-day batch jobs or backfill after a scheduler outage.

query Parameters
asOf
string <date>

Execution date to evaluate due orders against (ISO-8601); defaults to today if omitted.

Responses

Response samples

Content type
application/json
{
  • "property1": 0,
  • "property2": 0
}

Cancel a standing order

Permanently cancels an ACTIVE standing order so no further transfers are executed. In-flight executions that are already posting at the time of cancellation are not rolled back. Returns 204 No Content on success; 404 if the order does not exist.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "error": "string",
  • "fieldErrors": {
    },
  • "message": "string"
}

FX Revaluation

End-of-day FX revaluation: marks every open FX position to the closing mid-rate and books the resulting unrealised gain or loss. Reads (listing prior revaluation runs) require payment:read; triggering a revaluation run requires transfer:operate.

List revaluation runs

Returns all recorded EOD FX revaluation runs, each showing the value date, the number of positions revalued, and the net P&L posted.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Run EOD FX revaluation

Executes the FX revaluation batch for the given value date (defaults to today if omitted). For each open FX position the engine marks it to the closing mid-rate, computes the unrealised gain or loss, and books an accounting entry. Returns the count of positions revalued. Running the same date twice will overwrite the previous result — not idempotent.

query Parameters
asOf
string <date>

Value date for the revaluation (ISO-8601, e.g. 2026-06-30); defaults to today if omitted.

Responses

Response samples

Content type
application/json
{
  • "property1": 0,
  • "property2": 0
}

Parties

Customer Information File (CIF) — owns the full lifecycle of every party (natural person or legal entity) in the bank. Manages registration, KYC/CDD decisions, lifecycle state transitions (active / blocked / closed), profile data (personal/corporate details, financial profile), and party elements (identifications, addresses, contacts, inter-party relationships). Results are scoped to the caller's branch context. Reads require customer:read; mutations require customer:write; KYC decisions require customer:kyc-decide.

List or search parties

Returns all parties visible to the caller's branch. When name or status query parameters are provided, delegates to the search port for filtered results; otherwise returns the full list. All results are post-filtered by branch visibility.

query Parameters
name
string

Partial or full display name to filter by (case-insensitive match)

status
string

Party lifecycle status to filter by (e.g. ACTIVE, BLOCKED, CLOSED, PENDING_KYC)

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Register a party

Creates a new party (natural person or legal entity) in the CIF and assigns it to the caller's branch. The party is placed in PENDING_KYC state; it cannot transact until a KYC decision is recorded. Returns 201 with the created party summary view.

Request Body schema: application/json
required
branchId
string <uuid>
cddTier
required
string non-empty
displayName
required
string non-empty
type
required
string non-empty

Responses

Request samples

Content type
application/json
{
  • "branchId": "712f308d-801e-48bc-b072-9c404734ceb7",
  • "cddTier": "string",
  • "displayName": "string",
  • "type": "string"
}

Response samples

Content type
application/json
{
  • "branchId": "712f308d-801e-48bc-b072-9c404734ceb7",
  • "cddTier": "string",
  • "displayName": "string",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "kycStatus": "string",
  • "status": "string",
  • "type": "string"
}

Get a party by id

Returns the summary view of a single party. Enforces branch-scope: if the party belongs to a branch the caller cannot see, the response is 404 (not 403) to avoid information leakage.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "branchId": "712f308d-801e-48bc-b072-9c404734ceb7",
  • "cddTier": "string",
  • "displayName": "string",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "kycStatus": "string",
  • "status": "string",
  • "type": "string"
}

Add an address

Attaches a postal or physical address to the party (residential, business, mailing, etc.). Multiple addresses of different types are allowed. Returns the updated full detail view.

path Parameters
id
required
string <uuid>
Request Body schema: application/json
required
addressType
required
string non-empty
city
string
country
required
string non-empty
line1
string
line2
string
postalCode
string
primary
boolean
stateProvince
string

Responses

Request samples

Content type
application/json
{
  • "addressType": "string",
  • "city": "string",
  • "country": "string",
  • "line1": "string",
  • "line2": "string",
  • "postalCode": "string",
  • "primary": true,
  • "stateProvince": "string"
}

Response samples

Content type
application/json
{
  • "addresses": [
    ],
  • "cddTier": "string",
  • "contacts": [
    ],
  • "displayName": "string",
  • "financialProfile": {
    },
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "identifications": [
    ],
  • "kycStatus": "string",
  • "organization": {
    },
  • "partyNumber": "string",
  • "pep": true,
  • "person": {
    },
  • "preferredCurrency": "string",
  • "preferredLanguage": "string",
  • "relationships": [
    ],
  • "riskRating": "string",
  • "segment": "string",
  • "status": "string",
  • "type": "string"
}

Remove an address

Removes a specific address from the party by its element id.

path Parameters
id
required
string <uuid>
addressId
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "addresses": [
    ],
  • "cddTier": "string",
  • "contacts": [
    ],
  • "displayName": "string",
  • "financialProfile": {
    },
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "identifications": [
    ],
  • "kycStatus": "string",
  • "organization": {
    },
  • "partyNumber": "string",
  • "pep": true,
  • "person": {
    },
  • "preferredCurrency": "string",
  • "preferredLanguage": "string",
  • "relationships": [
    ],
  • "riskRating": "string",
  • "segment": "string",
  • "status": "string",
  • "type": "string"
}

Block a party

Suspends an ACTIVE party, preventing any further account transactions or loan disbursements. Typically used for fraud, AML flags, or court orders. The party can be unblocked later.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "branchId": "712f308d-801e-48bc-b072-9c404734ceb7",
  • "cddTier": "string",
  • "displayName": "string",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "kycStatus": "string",
  • "status": "string",
  • "type": "string"
}

Change CDD tier

Upgrades or downgrades the party's Customer Due Diligence (CDD) tier. The tier determines which KYC elements are required and what transaction limits apply. Requires customer:kyc-decide authority.

path Parameters
id
required
string <uuid>
query Parameters
tier
required
string

Target CDD tier (e.g. SIMPLIFIED, STANDARD, ENHANCED)

Responses

Response samples

Content type
application/json
{
  • "branchId": "712f308d-801e-48bc-b072-9c404734ceb7",
  • "cddTier": "string",
  • "displayName": "string",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "kycStatus": "string",
  • "status": "string",
  • "type": "string"
}

Close a party

Permanently closes a party (terminal state). A closed party cannot be reactivated. Precondition: all linked accounts and facilities must be closed or settled before the CIF record can be closed.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "branchId": "712f308d-801e-48bc-b072-9c404734ceb7",
  • "cddTier": "string",
  • "displayName": "string",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "kycStatus": "string",
  • "status": "string",
  • "type": "string"
}

Add a contact

Attaches a contact point (phone number, email address, etc.) to the party. Multiple contacts of different types are allowed. Returns the updated full detail view.

path Parameters
id
required
string <uuid>
Request Body schema: application/json
required
consentToContact
boolean
contactType
required
string non-empty
primary
boolean
value
required
string non-empty

Responses

Request samples

Content type
application/json
{
  • "consentToContact": true,
  • "contactType": "string",
  • "primary": true,
  • "value": "string"
}

Response samples

Content type
application/json
{
  • "addresses": [
    ],
  • "cddTier": "string",
  • "contacts": [
    ],
  • "displayName": "string",
  • "financialProfile": {
    },
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "identifications": [
    ],
  • "kycStatus": "string",
  • "organization": {
    },
  • "partyNumber": "string",
  • "pep": true,
  • "person": {
    },
  • "preferredCurrency": "string",
  • "preferredLanguage": "string",
  • "relationships": [
    ],
  • "riskRating": "string",
  • "segment": "string",
  • "status": "string",
  • "type": "string"
}

Remove a contact

Removes a specific contact point from the party by its element id.

path Parameters
id
required
string <uuid>
contactId
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "addresses": [
    ],
  • "cddTier": "string",
  • "contacts": [
    ],
  • "displayName": "string",
  • "financialProfile": {
    },
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "identifications": [
    ],
  • "kycStatus": "string",
  • "organization": {
    },
  • "partyNumber": "string",
  • "pep": true,
  • "person": {
    },
  • "preferredCurrency": "string",
  • "preferredLanguage": "string",
  • "relationships": [
    ],
  • "riskRating": "string",
  • "segment": "string",
  • "status": "string",
  • "type": "string"
}

Get full party detail

Returns the complete detail view of a party, including personal or corporate profile data, financial profile, all identifications, addresses, contacts, and inter-party relationships.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "addresses": [
    ],
  • "cddTier": "string",
  • "contacts": [
    ],
  • "displayName": "string",
  • "financialProfile": {
    },
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "identifications": [
    ],
  • "kycStatus": "string",
  • "organization": {
    },
  • "partyNumber": "string",
  • "pep": true,
  • "person": {
    },
  • "preferredCurrency": "string",
  • "preferredLanguage": "string",
  • "relationships": [
    ],
  • "riskRating": "string",
  • "segment": "string",
  • "status": "string",
  • "type": "string"
}

Set financial profile

Stores or replaces the party's financial profile (income band, source of funds, employment status, etc.) used for credit scoring, AML risk assessment, and product eligibility checks.

path Parameters
id
required
string <uuid>
Request Body schema: application/json
required
annualIncomeBand
string
employerName
string
employmentStatus
string
occupation
string
purposeOfAccount
string
sourceOfFunds
string
sourceOfWealth
string

Responses

Request samples

Content type
application/json
{
  • "annualIncomeBand": "string",
  • "employerName": "string",
  • "employmentStatus": "string",
  • "occupation": "string",
  • "purposeOfAccount": "string",
  • "sourceOfFunds": "string",
  • "sourceOfWealth": "string"
}

Response samples

Content type
application/json
{
  • "addresses": [
    ],
  • "cddTier": "string",
  • "contacts": [
    ],
  • "displayName": "string",
  • "financialProfile": {
    },
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "identifications": [
    ],
  • "kycStatus": "string",
  • "organization": {
    },
  • "partyNumber": "string",
  • "pep": true,
  • "person": {
    },
  • "preferredCurrency": "string",
  • "preferredLanguage": "string",
  • "relationships": [
    ],
  • "riskRating": "string",
  • "segment": "string",
  • "status": "string",
  • "type": "string"
}

Add an identification document

Attaches an identification document (national ID, passport, driver's licence, etc.) to the party. Each document type/number combination must be unique within the party. Returns the updated full detail view.

path Parameters
id
required
string <uuid>
Request Body schema: application/json
required
expiryDate
string <date>
idNumber
required
string non-empty
idType
required
string non-empty
issueDate
string <date>
issuingAuthority
string
issuingCountry
string
primary
boolean

Responses

Request samples

Content type
application/json
{
  • "expiryDate": "2019-08-24",
  • "idNumber": "string",
  • "idType": "string",
  • "issueDate": "2019-08-24",
  • "issuingAuthority": "string",
  • "issuingCountry": "string",
  • "primary": true
}

Response samples

Content type
application/json
{
  • "addresses": [
    ],
  • "cddTier": "string",
  • "contacts": [
    ],
  • "displayName": "string",
  • "financialProfile": {
    },
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "identifications": [
    ],
  • "kycStatus": "string",
  • "organization": {
    },
  • "partyNumber": "string",
  • "pep": true,
  • "person": {
    },
  • "preferredCurrency": "string",
  • "preferredLanguage": "string",
  • "relationships": [
    ],
  • "riskRating": "string",
  • "segment": "string",
  • "status": "string",
  • "type": "string"
}

Remove an identification document

Removes a specific identification document from the party by its element id.

path Parameters
id
required
string <uuid>
identificationId
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "addresses": [
    ],
  • "cddTier": "string",
  • "contacts": [
    ],
  • "displayName": "string",
  • "financialProfile": {
    },
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "identifications": [
    ],
  • "kycStatus": "string",
  • "organization": {
    },
  • "partyNumber": "string",
  • "pep": true,
  • "person": {
    },
  • "preferredCurrency": "string",
  • "preferredLanguage": "string",
  • "relationships": [
    ],
  • "riskRating": "string",
  • "segment": "string",
  • "status": "string",
  • "type": "string"
}

Record a KYC decision

Records an approved or rejected KYC outcome against a party, stamped with the authenticated officer's username. An approved decision moves the party from PENDING_KYC to ACTIVE, enabling account opening and transactions. A rejected decision keeps the party non-transactional. Requires customer:kyc-decide authority.

path Parameters
id
required
string <uuid>
query Parameters
approved
required
boolean

true to approve KYC (transitions party to ACTIVE), false to reject

Responses

Response samples

Content type
application/json
{
  • "branchId": "712f308d-801e-48bc-b072-9c404734ceb7",
  • "cddTier": "string",
  • "displayName": "string",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "kycStatus": "string",
  • "status": "string",
  • "type": "string"
}

Get KYC requirements

Returns the KYC completeness view for a party relative to its current CDD tier: which identification types, address types, and other elements are required versus satisfied. Useful for driving onboarding checklists in the UI.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "cddTier": "string",
  • "complete": true,
  • "missing": [
    ],
  • "partyId": "950a3d1f-4657-4e7b-87db-3ff5fa95b5c0"
}

Update legal entity profile

Replaces the corporate profile fields of a LEGAL_ENTITY party (registered name, registration number, incorporation date, country of incorporation, business sector, etc.).

path Parameters
id
required
string <uuid>
Request Body schema: application/json
required
dateOfIncorporation
string <date>
industryIsic
string
legalForm
string
legalName
string
listed
boolean
numberOfEmployees
integer <int32>
registrationCountry
string
registrationNumber
string
regulatoryStatus
string
tradingName
string
website
string

Responses

Request samples

Content type
application/json
{
  • "dateOfIncorporation": "2019-08-24",
  • "industryIsic": "string",
  • "legalForm": "string",
  • "legalName": "string",
  • "listed": true,
  • "numberOfEmployees": 0,
  • "registrationCountry": "string",
  • "registrationNumber": "string",
  • "regulatoryStatus": "string",
  • "tradingName": "string",
  • "website": "string"
}

Response samples

Content type
application/json
{
  • "addresses": [
    ],
  • "cddTier": "string",
  • "contacts": [
    ],
  • "displayName": "string",
  • "financialProfile": {
    },
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "identifications": [
    ],
  • "kycStatus": "string",
  • "organization": {
    },
  • "partyNumber": "string",
  • "pep": true,
  • "person": {
    },
  • "preferredCurrency": "string",
  • "preferredLanguage": "string",
  • "relationships": [
    ],
  • "riskRating": "string",
  • "segment": "string",
  • "status": "string",
  • "type": "string"
}

Update natural person profile

Replaces the demographic and personal profile fields of a NATURAL_PERSON party (date of birth, gender, nationality, marital status, etc.). Has no effect on linked accounts or KYC status.

path Parameters
id
required
string <uuid>
Request Body schema: application/json
required
countryOfResidence
string
dateOfBirth
string <date>
dependentsCount
integer <int32>
firstName
string
gender
string
lastName
string
maidenName
string
maritalStatus
string
middleName
string
mothersMaidenName
string
nationality
string
placeOfBirth
string
salutation
string

Responses

Request samples

Content type
application/json
{
  • "countryOfResidence": "string",
  • "dateOfBirth": "2019-08-24",
  • "dependentsCount": 0,
  • "firstName": "string",
  • "gender": "string",
  • "lastName": "string",
  • "maidenName": "string",
  • "maritalStatus": "string",
  • "middleName": "string",
  • "mothersMaidenName": "string",
  • "nationality": "string",
  • "placeOfBirth": "string",
  • "salutation": "string"
}

Response samples

Content type
application/json
{
  • "addresses": [
    ],
  • "cddTier": "string",
  • "contacts": [
    ],
  • "displayName": "string",
  • "financialProfile": {
    },
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "identifications": [
    ],
  • "kycStatus": "string",
  • "organization": {
    },
  • "partyNumber": "string",
  • "pep": true,
  • "person": {
    },
  • "preferredCurrency": "string",
  • "preferredLanguage": "string",
  • "relationships": [
    ],
  • "riskRating": "string",
  • "segment": "string",
  • "status": "string",
  • "type": "string"
}

Add a party relationship

Records a directed relationship between this party and another party (e.g. DIRECTOR_OF, GUARANTOR_FOR, NEXT_OF_KIN, EMPLOYER). Used for group-customer structures, guarantee chains, and AML network analysis. Returns the updated full detail view.

path Parameters
id
required
string <uuid>
Request Body schema: application/json
required
controlling
boolean
ownershipPercent
number
relatedName
string
relatedPartyId
string <uuid>
relationshipType
required
string non-empty

Responses

Request samples

Content type
application/json
{
  • "controlling": true,
  • "ownershipPercent": 0,
  • "relatedName": "string",
  • "relatedPartyId": "fa79ba54-b814-40a7-afb4-54021a6104c6",
  • "relationshipType": "string"
}

Response samples

Content type
application/json
{
  • "addresses": [
    ],
  • "cddTier": "string",
  • "contacts": [
    ],
  • "displayName": "string",
  • "financialProfile": {
    },
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "identifications": [
    ],
  • "kycStatus": "string",
  • "organization": {
    },
  • "partyNumber": "string",
  • "pep": true,
  • "person": {
    },
  • "preferredCurrency": "string",
  • "preferredLanguage": "string",
  • "relationships": [
    ],
  • "riskRating": "string",
  • "segment": "string",
  • "status": "string",
  • "type": "string"
}

Remove a party relationship

Removes a specific inter-party relationship from the party by its element id.

path Parameters
id
required
string <uuid>
relationshipId
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "addresses": [
    ],
  • "cddTier": "string",
  • "contacts": [
    ],
  • "displayName": "string",
  • "financialProfile": {
    },
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "identifications": [
    ],
  • "kycStatus": "string",
  • "organization": {
    },
  • "partyNumber": "string",
  • "pep": true,
  • "person": {
    },
  • "preferredCurrency": "string",
  • "preferredLanguage": "string",
  • "relationships": [
    ],
  • "riskRating": "string",
  • "segment": "string",
  • "status": "string",
  • "type": "string"
}

Unblock a party

Returns a BLOCKED party to ACTIVE status, re-enabling transactions and product access.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "branchId": "712f308d-801e-48bc-b072-9c404734ceb7",
  • "cddTier": "string",
  • "displayName": "string",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "kycStatus": "string",
  • "status": "string",
  • "type": "string"
}

Commission Beneficiaries

Registry of commission beneficiaries (agents, introducers, or internal cost-centres) that receive earned commission payouts. Each beneficiary record stores the settlement account, sweep frequency, and withholding-tax (WHT) rate used when disbursing commissions. Reads are open to authenticated users; mutations (register, update, activate, deactivate) require the pricing:manage authority.

List all commission beneficiaries

Returns every registered beneficiary with their settlement account, sweep frequency, WHT rate and current active/inactive status.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Register a commission beneficiary

Creates a new beneficiary entry in the commission registry. The supplied settlement account, sweep frequency and WHT rate are persisted and will be used for all future commission disbursements to this beneficiary. The beneficiary is created in an active state. Requires pricing:manage.

Request Body schema: application/json
required
anchor
string
beneficiaryId
required
string <uuid>
frequency
string
name
string
settlementAccountId
required
string <uuid>
settlementDay
integer <int32>
whtTaxClass
string

Responses

Request samples

Content type
application/json
{
  • "anchor": "string",
  • "beneficiaryId": "410e5c37-9603-4e5b-81b1-7cb895f362e8",
  • "frequency": "string",
  • "name": "string",
  • "settlementAccountId": "341894e0-9bf3-408a-9878-bf1204ed5fb2",
  • "settlementDay": 0,
  • "whtTaxClass": "string"
}

Response samples

Content type
application/json
{
  • "error": "string",
  • "fieldErrors": {
    },
  • "message": "string"
}

Update a commission beneficiary

Replaces the settlement account, sweep frequency and WHT rate for an existing beneficiary. The update takes effect on the next commission sweep cycle — in-flight disbursements already queued are not affected. Returns 204 on success. Requires pricing:manage.

path Parameters
id
required
string <uuid>
Request Body schema: application/json
required
anchor
string
beneficiaryId
required
string <uuid>
frequency
string
name
string
settlementAccountId
required
string <uuid>
settlementDay
integer <int32>
whtTaxClass
string

Responses

Request samples

Content type
application/json
{
  • "anchor": "string",
  • "beneficiaryId": "410e5c37-9603-4e5b-81b1-7cb895f362e8",
  • "frequency": "string",
  • "name": "string",
  • "settlementAccountId": "341894e0-9bf3-408a-9878-bf1204ed5fb2",
  • "settlementDay": 0,
  • "whtTaxClass": "string"
}

Response samples

Content type
application/json
{
  • "error": "string",
  • "fieldErrors": {
    },
  • "message": "string"
}

Activate a commission beneficiary

Restores an inactive beneficiary to active status, resuming commission accruals and enabling future sweep disbursements. Idempotent when called on an already-active beneficiary. Returns 204 on success. Requires pricing:manage.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "error": "string",
  • "fieldErrors": {
    },
  • "message": "string"
}

Deactivate a commission beneficiary

Marks the beneficiary as inactive, suspending all future commission accruals and disbursements to them. Already-earned commissions remain in the ledger and can be paid out if the beneficiary is later reactivated. Returns 204 on success. Requires pricing:manage.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "error": "string",
  • "fieldErrors": {
    },
  • "message": "string"
}

Users

User account management and authorization resolution for the Cortex access context. Staff reads (list/get) are available to any authenticated principal; all mutations (create, update, role assignment, password reset, enable/disable) and the authserver integration endpoints (authorization, credentials) require the admin:users authority.

List all users

Returns every user account with their profile and assigned roles.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create a user

Creates a new user account and persists their initial profile. Returns 201 with the fully populated UserView. The created account is enabled by default; roles can be assigned immediately via the roles endpoint. Requires admin:users.

Request Body schema: application/json
required
displayName
required
string non-empty
homeBranch
required
string non-empty
password
required
string non-empty
roleCodes
Array of strings
username
required
string non-empty

Responses

Request samples

Content type
application/json
{
  • "displayName": "string",
  • "homeBranch": "string",
  • "password": "string",
  • "roleCodes": [
    ],
  • "username": "string"
}

Response samples

Content type
application/json
{
  • "displayName": "string",
  • "homeBranch": "string",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "roles": [
    ],
  • "status": "string",
  • "username": "string"
}

Get a user by id

Returns one user, or 404 if no user has that id.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "displayName": "string",
  • "homeBranch": "string",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "roles": [
    ],
  • "status": "string",
  • "username": "string"
}

Update a user's profile

Replaces the mutable profile fields (e.g. name, email) for the given user. Role assignments are managed separately via the roles endpoint. Returns the updated UserView, or 404 if the user does not exist. Requires admin:users.

path Parameters
id
required
string <uuid>
Request Body schema: application/json
required
displayName
required
string non-empty
homeBranch
required
string non-empty

Responses

Request samples

Content type
application/json
{
  • "displayName": "string",
  • "homeBranch": "string"
}

Response samples

Content type
application/json
{
  • "displayName": "string",
  • "homeBranch": "string",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "roles": [
    ],
  • "status": "string",
  • "username": "string"
}

Disable a user account

Marks the user account as disabled, preventing the principal from authenticating. Existing active sessions are not terminated immediately but will fail to refresh. Returns the updated UserView. Requires admin:users.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "displayName": "string",
  • "homeBranch": "string",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "roles": [
    ],
  • "status": "string",
  • "username": "string"
}

Enable a user account

Marks the user account as enabled so the principal can authenticate. No-op if the account is already enabled. Returns the updated UserView. Requires admin:users.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "displayName": "string",
  • "homeBranch": "string",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "roles": [
    ],
  • "status": "string",
  • "username": "string"
}

Reset a user's password

Sets a new BCrypt-hashed password for the given user. The old password is not required (admin-side reset). Returns 204 No Content on success. The user must re-authenticate after a password reset. Requires admin:users.

path Parameters
id
required
string <uuid>
Request Body schema: application/json
required
password
required
string non-empty

Responses

Request samples

Content type
application/json
{
  • "password": "string"
}

Response samples

Content type
application/json
{
  • "error": "string",
  • "fieldErrors": {
    },
  • "message": "string"
}

Assign roles to a user

Replaces the full set of roles assigned to the user with the roles supplied in the command body. Effective permissions are recalculated immediately; any active tokens for the user will reflect the new role set on the next token refresh. Returns the updated UserView. Requires admin:users.

path Parameters
id
required
string <uuid>
Request Body schema: application/json
required
roleCodes
Array of strings

Responses

Request samples

Content type
application/json
{
  • "roleCodes": [
    ]
}

Response samples

Content type
application/json
{
  • "displayName": "string",
  • "homeBranch": "string",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "roles": [
    ],
  • "status": "string",
  • "username": "string"
}

Resolve effective authorization for a user

Returns the flattened set of roles and permissions (authorities) for the given username. Used by the dev authserver to populate the claims of a minted access token. Returns 404 if the username does not exist. Requires admin:users.

path Parameters
username
required
string

Login username of the principal whose authorization is being resolved

Responses

Response samples

Content type
application/json
{
  • "branch": "string",
  • "enabled": true,
  • "permissions": [
    ],
  • "role": "string",
  • "tierRoles": [
    ],
  • "username": "string"
}

Fetch stored credentials for a user

Returns the BCrypt password hash and enabled flag for the given username. Called by the dev authserver's UserDetailsService during login verification. Returns 404 if the username does not exist. Requires admin:users.

path Parameters
username
required
string

Login username of the principal whose credentials are being fetched

Responses

Response samples

Content type
application/json
{
  • "enabled": true,
  • "passwordHash": "string",
  • "username": "string"
}

GL Periods

Accounting period management and the fiscal-year close lifecycle (General Ledger). Each period carries a fiscal year, a period code, and a state machine: OPEN → CLOSED → LOCKED (with a REOPEN escape hatch back to OPEN). Postings are only accepted against OPEN periods. Reads require gl:read; all state-transition mutations require gl:manage.

List accounting periods

Returns all accounting periods across every fiscal year, including their state (OPEN, CLOSED, LOCKED).

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Open a fiscal year

Creates the full set of monthly accounting periods for the given fiscal year and places them in OPEN state. Fails if any period for that year already exists. This is typically run once at the start of each financial year before any postings are made.

Request Body schema: application/json
required
property name*
additional property
integer <int32>

Responses

Request samples

Content type
application/json
{
  • "property1": 0,
  • "property2": 0
}

Response samples

Content type
application/json
{
  • "error": "string",
  • "fieldErrors": {
    },
  • "message": "string"
}

Close an accounting period

Transitions an OPEN period to CLOSED. Once closed, no new journal entries may be posted against it. A closed period can be locked (to prevent reopening) or reopened if an adjustment is needed. Returns 204 on success.

path Parameters
code
required
string

Period code, e.g. 2025-01

Responses

Response samples

Content type
application/json
{
  • "error": "string",
  • "fieldErrors": {
    },
  • "message": "string"
}

Lock an accounting period

Permanently locks a CLOSED period, preventing it from being reopened. Used after the external audit sign-off to protect the ledger balances from any retroactive adjustment. This transition is terminal — a locked period cannot be unlocked. Returns 204 on success.

path Parameters
code
required
string

Period code, e.g. 2025-01

Responses

Response samples

Content type
application/json
{
  • "error": "string",
  • "fieldErrors": {
    },
  • "message": "string"
}

Reopen an accounting period

Returns a CLOSED period to OPEN so that correcting journal entries can be posted. Only CLOSED (not LOCKED) periods can be reopened. The period must be explicitly closed again once the correction is complete. Returns 204 on success.

path Parameters
code
required
string

Period code, e.g. 2025-01

Responses

Response samples

Content type
application/json
{
  • "error": "string",
  • "fieldErrors": {
    },
  • "message": "string"
}

Retail Auth

Authentication and session management for retail (self-service) customers. Handles credential-based login, session cookie issuance, logout, and SCA step-up (OTP) flows. No staff permission model applies — callers are end-customers identified by an HttpOnly session cookie set at login. The session cookie is scoped to /api/v1/retail and expires after 30 minutes of inactivity.

Log in a retail customer

Validates the customer's credentials and, on success, issues an HttpOnly session cookie (30-minute max-age, SameSite=Lax, scoped to /api/v1/retail). The response body carries partyId, initial authLevel (AUTHENTICATED), and the cookie expiry timestamp. Returns 401 if the credentials are invalid or the account is locked.

Request Body schema: application/json
required
identifier
required
string non-empty
secret
required
string non-empty

Responses

Request samples

Content type
application/json
{
  • "identifier": "string",
  • "secret": "string"
}

Response samples

Content type
application/json
{
  • "property1": null,
  • "property2": null
}

Log out the current session

Invalidates the session identified by the session cookie (if present) and immediately clears the cookie by setting its max-age to 0. Safe to call even if no cookie is present (required=false) — the response is always 204 No Content. Idempotent.

cookie Parameters
cortex_retail
string

Responses

Response samples

Content type
application/json
{
  • "error": "string",
  • "fieldErrors": {
    },
  • "message": "string"
}

Initiate SCA step-up

Triggers an OTP challenge for the authenticated session, elevating it toward SCA_VERIFIED status required for high-value or sensitive operations. The OTP is dispatched via the customer's registered out-of-band channel (e.g. SMS). Returns immediately with {status: "OTP_ISSUED"} — the OTP code must be submitted to /step-up/verify to complete step-up. Requires an active session cookie.

cookie Parameters
cortex_retail
required
string

Responses

Response samples

Content type
application/json
{
  • "property1": "string",
  • "property2": "string"
}

Verify SCA OTP and elevate session

Validates the OTP code submitted in the request body against the pending step-up challenge for the current session. On success, the session's authLevel is promoted to SCA_VERIFIED and the response carries {verified: true, authLevel: "SCA_VERIFIED"}. On failure, {verified: false, authLevel: "AUTHENTICATED"} is returned without locking the session (rate-limiting and lockout are enforced by the use-case layer). Requires an active session cookie with a pending step-up challenge initiated via /step-up.

cookie Parameters
cortex_retail
required
string
Request Body schema: application/json
required
property name*
additional property
string

Responses

Request samples

Content type
application/json
{
  • "property1": "string",
  • "property2": "string"
}

Response samples

Content type
application/json
{
  • "property1": null,
  • "property2": null
}

Business Calendars

Business calendars and public-holiday schedules used across the banking platform to determine business days, value dates, and settlement cutoffs. Reads are open to any authenticated staff member; creating, updating, activating/deactivating calendars, and managing holidays requires the reference:manage authority.

List all calendars

Returns every defined business calendar with its code, name, status, and weekend configuration.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create a calendar

Creates a new business calendar. The calendar code must be unique across the system. The new calendar is created in an inactive state and must be explicitly activated before it influences business-day calculations. Requires reference:manage.

Request Body schema: application/json
required
calendarCode
required
string non-empty
name
required
string non-empty
weekendDays
Array of strings

Responses

Request samples

Content type
application/json
{
  • "calendarCode": "string",
  • "name": "string",
  • "weekendDays": [
    ]
}

Response samples

Content type
application/json
{
  • "active": true,
  • "calendarCode": "string",
  • "name": "string",
  • "weekendDays": [
    ]
}

Get a calendar by code

Returns the calendar identified by the given code, or 404 if no calendar with that code exists.

path Parameters
code
required
string

Responses

Response samples

Content type
application/json
{
  • "active": true,
  • "calendarCode": "string",
  • "name": "string",
  • "weekendDays": [
    ]
}

Update a calendar

Replaces the calendar's metadata (name, description, weekend days) identified by the given code. Does not affect holidays or the active/inactive status. Requires reference:manage.

path Parameters
code
required
string
Request Body schema: application/json
required
calendarCode
required
string non-empty
name
required
string non-empty
weekendDays
Array of strings

Responses

Request samples

Content type
application/json
{
  • "calendarCode": "string",
  • "name": "string",
  • "weekendDays": [
    ]
}

Response samples

Content type
application/json
{
  • "active": true,
  • "calendarCode": "string",
  • "name": "string",
  • "weekendDays": [
    ]
}

Activate a calendar

Moves a calendar to ACTIVE status so it is used in business-day and value-date calculations. Activating an already-active calendar is safe (no-op). Requires reference:manage.

path Parameters
code
required
string

Responses

Response samples

Content type
application/json
{
  • "active": true,
  • "calendarCode": "string",
  • "name": "string",
  • "weekendDays": [
    ]
}

Describe a business day

Returns whether the given date is a business day according to the specified calendar, accounting for weekends and registered public holidays. Also surfaces the next and previous business days relative to the queried date.

path Parameters
code
required
string
query Parameters
date
required
string <date>

The date to evaluate, in ISO-8601 format (yyyy-MM-dd)

Responses

Response samples

Content type
application/json
{
  • "businessDay": true,
  • "calendarCode": "string",
  • "date": "2019-08-24",
  • "holiday": true,
  • "lastBusinessDayOfMonth": "2019-08-24"
}

Deactivate a calendar

Moves a calendar to INACTIVE status, excluding it from business-day and value-date calculations. Existing holidays are preserved. Requires reference:manage.

path Parameters
code
required
string

Responses

Response samples

Content type
application/json
{
  • "active": true,
  • "calendarCode": "string",
  • "name": "string",
  • "weekendDays": [
    ]
}

List holidays for a calendar

Returns all public holidays registered against the specified calendar, ordered by date.

path Parameters
code
required
string

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Add a holiday to a calendar

Adds a public holiday to the specified calendar. The holiday date must not already exist on the calendar. Returns the generated holiday id. Requires reference:manage.

path Parameters
code
required
string
Request Body schema: application/json
required
day
integer <int32>
month
integer <int32>
name
required
string non-empty
year
integer <int32>

Responses

Request samples

Content type
application/json
{
  • "day": 0,
  • "month": 0,
  • "name": "string",
  • "year": 0
}

Response samples

Content type
application/json
{
  • "property1": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "property2": "497f6eca-6276-4993-bfeb-53cbbbba6f08"
}

Remove a holiday from a calendar

Deletes the specified holiday entry from the calendar. Once removed, that date will be treated as a regular weekday (or weekend, per the calendar's weekend configuration). Returns 204 No Content. Requires reference:manage.

path Parameters
code
required
string
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "error": "string",
  • "fieldErrors": {
    },
  • "message": "string"
}

AML Rules

Management of transaction monitoring rules used by the AML engine to detect suspicious activity. Rules are evaluated against transactions in real-time and can trigger alerts or blocks depending on their configuration. Reads require aml:read; rule mutations (create/update/activate/deactivate) require aml:operate.

List monitoring rules

Returns all AML monitoring rules with their current status, thresholds and configuration.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create or update a monitoring rule

Creates a new monitoring rule or updates an existing one if a rule with the same logical key already exists (upsert semantics). The rule is persisted in INACTIVE state after creation and must be explicitly activated before the AML engine evaluates it. Returns the saved rule with its assigned id.

Request Body schema: application/json
required
ratio
number
ruleCode
required
string non-empty
severity
string
threshold
number
txnCount
integer <int32>
type
required
string non-empty
windowDays
integer <int32>

Responses

Request samples

Content type
application/json
{
  • "ratio": 0,
  • "ruleCode": "string",
  • "severity": "string",
  • "threshold": 0,
  • "txnCount": 0,
  • "type": "string",
  • "windowDays": 0
}

Response samples

Content type
application/json
{
  • "active": true,
  • "ratio": 0,
  • "ruleCode": "string",
  • "ruleId": "70af3071-65d9-4ec3-b3cb-5283e8d55dac",
  • "severity": "string",
  • "threshold": 0,
  • "txnCount": 0,
  • "type": "string",
  • "windowDays": 0
}

Activate a monitoring rule

Moves the rule to ACTIVE state so the AML engine begins evaluating it against incoming transactions. Has no effect (idempotent) if the rule is already active. Returns 204 No Content on success.

path Parameters
id
required
string <uuid>

Monitoring rule id

Responses

Response samples

Content type
application/json
{
  • "error": "string",
  • "fieldErrors": {
    },
  • "message": "string"
}

Deactivate a monitoring rule

Suspends the rule so the AML engine stops evaluating it without deleting it. In-flight evaluations already triggered by the rule are not rolled back. Has no effect (idempotent) if the rule is already inactive. Returns 204 No Content on success.

path Parameters
id
required
string <uuid>

Monitoring rule id

Responses

Response samples

Content type
application/json
{
  • "error": "string",
  • "fieldErrors": {
    },
  • "message": "string"
}

Statements

Account statement generation, retrieval, and binary download, plus statement-cycle configuration (staff/operations). A statement document captures a closing balance, period transaction list, and a rendered PDF/binary payload for a given account and cycle period. Statement cycles drive the periodic generation schedule per account. Reads require statement:read; generation and cycle mutations require statement:operate.

List statements

Returns all statement documents, or — when accountId is supplied — only those belonging to that account. Each document includes the period dates, closing balance, and metadata but not the binary payload (use the download endpoint for that).

query Parameters
accountId
string <uuid>

Filter results to a single account; omit to return all statements

Responses

Response samples

Content type
application/json
[
  • {
    }
]

List statement cycles

Returns all statement cycle configurations — one per account that has a cycle defined — with their cut-off day and frequency settings.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create or update a statement cycle

Creates a new statement cycle or replaces an existing one for the account identified in the command body (upsert semantics). The cycle defines the cut-off day-of-month and generation frequency that the batch job uses to trigger periodic statement production. Requires statement:operate.

Request Body schema: application/json
required
accountId
required
string <uuid>
active
boolean
deliveryChannel
string
firstRunDate
string <date>
format
string
frequency
required
string

Responses

Request samples

Content type
application/json
{
  • "accountId": "3d07c219-0a88-45be-9cfc-91e9d095a1e9",
  • "active": true,
  • "deliveryChannel": "string",
  • "firstRunDate": "2019-08-24",
  • "format": "string",
  • "frequency": "string"
}

Response samples

Content type
application/json
{
  • "accountId": "3d07c219-0a88-45be-9cfc-91e9d095a1e9",
  • "active": true,
  • "deliveryChannel": "string",
  • "format": "string",
  • "frequency": "string",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "nextRunDate": "string"
}

Get cycle for an account

Returns the statement cycle configured for the given account, or 404 if no cycle has been set up for that account.

path Parameters
accountId
required
string <uuid>

Account id whose statement cycle is requested

Responses

Response samples

Content type
application/json
{
  • "accountId": "3d07c219-0a88-45be-9cfc-91e9d095a1e9",
  • "active": true,
  • "deliveryChannel": "string",
  • "format": "string",
  • "frequency": "string",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "nextRunDate": "string"
}

Generate a statement

Generates and persists a new statement document for the specified account and period. The use case computes the closing balance, collects the period transaction list, renders the binary payload, and stores the result. Returns 201 with the new document on success. Requires statement:operate.

Request Body schema: application/json
required
accountId
required
string <uuid>
format
string
fromDate
required
string <date>
toDate
required
string <date>

Responses

Request samples

Content type
application/json
{
  • "accountId": "3d07c219-0a88-45be-9cfc-91e9d095a1e9",
  • "format": "string",
  • "fromDate": "2019-08-24",
  • "toDate": "2019-08-24"
}

Response samples

Content type
application/json
{
  • "accountId": "3d07c219-0a88-45be-9cfc-91e9d095a1e9",
  • "accountNumber": "string",
  • "closingBalance": {
    },
  • "currency": "string",
  • "deliveryStatus": "string",
  • "format": "string",
  • "generatedAt": "string",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "lineCount": 0,
  • "openingBalance": {
    },
  • "partyId": "950a3d1f-4657-4e7b-87db-3ff5fa95b5c0",
  • "periodFrom": "string",
  • "periodTo": "string",
  • "reference": "string",
  • "totalCredits": {
    },
  • "totalDebits": {
    }
}

Get a statement by id

Returns one statement document with its metadata, or 404 if no statement has that id.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "accountId": "3d07c219-0a88-45be-9cfc-91e9d095a1e9",
  • "accountNumber": "string",
  • "closingBalance": {
    },
  • "currency": "string",
  • "deliveryStatus": "string",
  • "format": "string",
  • "generatedAt": "string",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "lineCount": 0,
  • "openingBalance": {
    },
  • "partyId": "950a3d1f-4657-4e7b-87db-3ff5fa95b5c0",
  • "periodFrom": "string",
  • "periodTo": "string",
  • "reference": "string",
  • "totalCredits": {
    },
  • "totalDebits": {
    }
}

Download statement binary

Streams the rendered binary content (typically PDF) of a statement as an attachment. The response Content-Disposition header carries the original filename and the Content-Type mirrors the stored media type. Returns 404 if the statement or its binary payload is absent.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
"string"

FX

FX quoting and deal booking (teller / payments / treasury). Provides indicative rate quotes with no side effects, and deal execution which posts the debit/credit pair across the two nominated accounts. Reads (quote, deals list) require payment:read; deal booking (convert) requires transfer:operate.

Execute a currency conversion

Books an FX deal: debits the source account in the from-currency and credits the target account in the to-currency at the prevailing rate. Posts both legs immediately — the deal is not reversible through this endpoint. Requires transfer:operate. Returns 201 with the booked FxDealView on success.

Request Body schema: application/json
required
creditorAccountId
required
string <uuid>
debtorAccountId
required
string <uuid>
idempotencyKey
string
required
object (MonetaryAmount)

A monetary amount as serialised by Jackson (JSR-354).

Responses

Request samples

Content type
application/json
{
  • "creditorAccountId": "0411bd28-c6c2-4498-8a47-b18d967449d7",
  • "debtorAccountId": "d9695c4c-f4a8-4c4e-b1b1-0b2201504693",
  • "idempotencyKey": "string",
  • "sellAmount": {
    }
}

Response samples

Content type
application/json
{
  • "createdAt": "string",
  • "createdBy": "string",
  • "creditorAccountId": "0411bd28-c6c2-4498-8a47-b18d967449d7",
  • "crossedVia": "string",
  • "dealId": "f480fdfe-5c44-458b-b537-f3d9f40f9678",
  • "debtorAccountId": "d9695c4c-f4a8-4c4e-b1b1-0b2201504693",
  • "fromAmount": {
    },
  • "rate": 0,
  • "rateAsOf": "string",
  • "reference": "string",
  • "toAmount": {
    }
}

List all FX deals

Returns all booked FX deals (executed conversions) in the system, ordered by booking time descending.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Get an FX rate quote

Returns an indicative FX quote (rate, converted amount, spread) for the given source amount and target currency. Pure read — no posting, no hold, and no deal is booked. Callers (funds-transfer, teller, payments) use this to price a conversion before committing.

query Parameters
amount
required
number

Amount in the source currency to convert

from
required
string

ISO 4217 source currency code (e.g. USD)

to
required
string

ISO 4217 target currency code (e.g. ZWG)

Responses

Response samples

Content type
application/json
{
  • "crossedVia": "string",
  • "from": {
    },
  • "rate": 0,
  • "rateAsOf": "string",
  • "to": {
    }
}

FX Rates

Exchange-rate catalog used system-wide for currency conversion (payments, FX trades, reporting). Rates are keyed by currency pair and are point-in-time snapshots — each upsert replaces the active rate for that pair. Reads require payment:read; creating/updating/deactivating rates requires reference:manage.

List exchange rates

Returns all currently active exchange rates in the catalog, keyed by currency pair.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create or update an exchange rate

Upserts the exchange rate for a currency pair: inserts a new rate if none exists for the pair, or replaces the existing active rate with the supplied bid/ask/mid values. The prior rate record is superseded (not deleted). Returns the resulting active rate. Requires reference:manage.

Request Body schema: application/json
required
ask
required
number
base
required
string non-empty
bid
required
number
mid
required
number
quote
required
string non-empty
source
string

Responses

Request samples

Content type
application/json
{
  • "ask": 0,
  • "base": "string",
  • "bid": 0,
  • "mid": 0,
  • "quote": "string",
  • "source": "string"
}

Response samples

Content type
application/json
{
  • "active": true,
  • "asOf": "string",
  • "ask": 0,
  • "base": "string",
  • "bid": 0,
  • "mid": 0,
  • "quote": "string",
  • "rateId": "dc6263b0-e8fb-4144-a111-53fde6c86836",
  • "source": "string"
}

Deactivate an exchange rate

Marks the specified exchange rate as inactive so it is no longer returned by list queries or used for conversions. This is a soft-delete / tombstone — the rate record is retained for audit. Returns 204 No Content on success. Requires reference:manage.

path Parameters
rateId
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "error": "string",
  • "fieldErrors": {
    },
  • "message": "string"
}

Card switch (acquirer/scheme)

The simulated card-acceptance edge — stands in for the ISO 8583 messages an acquirer/scheme would send. Drives the hold-then-post discipline: authorize places a memo hold against the card's funding source (deposit balance, credit line, or prepaid stored value) WITHOUT posting; clearing releases the hold and posts the customer debit. Decline/reversal/expiry release the hold. Real switch integration replaces this behind the AuthorizationConnector SPI.

Authorize a card transaction (0100/0200)

Runs limit + funds checks and places a memo hold on the card's funding source (no posting). Returns an APPROVED authorization (available balance drops by the hold; ledger balance is unchanged) or a DECLINED one with a reason. Partially approves when funds are short of the requested amount. A single-message (ATM/PIN) authorization holds and captures atomically. Idempotent on the network reference, so acquirer retries never double-act.

Request Body schema: application/json
required
required
object (MonetaryAmount)

A monetary amount as serialised by Jackson (JSR-354).

cardToken
required
string non-empty
channel
string
mcc
string
merchant
string
messageType
string
networkRef
string

Responses

Request samples

Content type
application/json
{
  • "amount": {
    },
  • "cardToken": "string",
  • "channel": "string",
  • "mcc": "string",
  • "merchant": "string",
  • "messageType": "string",
  • "networkRef": "string"
}

Response samples

Content type
application/json
{
  • "amount": {
    },
  • "capturedAmount": {
    },
  • "cardId": "f16ba382-eb42-481a-b08f-c57bdc9aae24",
  • "channel": "string",
  • "createdAt": "string",
  • "declineReason": "string",
  • "expiresAt": "string",
  • "holdId": "05363803-5510-4d71-8d1f-307021f9ad73",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "mcc": "string",
  • "merchant": "string",
  • "messageType": "string",
  • "networkRef": "string",
  • "reference": "string",
  • "status": "string"
}

Capture / clear an authorization (0220)

Settlement presentment: releases the memo hold and posts the actual customer debit through the funding source (deposit withdrawal, credit-line draw, or prepaid spend), producing a cleared CardTransaction. Omit the amount to capture the full authorized amount, or pass a smaller amount for a partial capture.

path Parameters
authId
required
string <uuid>
Request Body schema: application/json
additional property
object (MonetaryAmount)

A monetary amount as serialised by Jackson (JSR-354).

Responses

Request samples

Content type
application/json
{
  • "property1": {
    },
  • "property2": {
    }
}

Response samples

Content type
application/json
{
  • "amount": {
    },
  • "authorizationId": "fd01ce3c-0799-43be-b4cd-b95dd107d4d8",
  • "cardId": "f16ba382-eb42-481a-b08f-c57bdc9aae24",
  • "channel": "string",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "merchant": "string",
  • "presentmentDate": "string",
  • "reference": "string",
  • "settlementBatchId": "4d097f96-5c46-47b0-9fb6-a44a590557dd",
  • "status": "string",
  • "type": "string"
}

Increment an open authorization

Raises the held amount on a still-PENDING authorization (e.g. a tip or fuel top-up), placing an additional hold on the funding source.

path Parameters
authId
required
string <uuid>
Request Body schema: application/json
required
additional property
object (MonetaryAmount)

A monetary amount as serialised by Jackson (JSR-354).

Responses

Request samples

Content type
application/json
{
  • "property1": {
    },
  • "property2": {
    }
}

Response samples

Content type
application/json
{
  • "amount": {
    },
  • "capturedAmount": {
    },
  • "cardId": "f16ba382-eb42-481a-b08f-c57bdc9aae24",
  • "channel": "string",
  • "createdAt": "string",
  • "declineReason": "string",
  • "expiresAt": "string",
  • "holdId": "05363803-5510-4d71-8d1f-307021f9ad73",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "mcc": "string",
  • "merchant": "string",
  • "messageType": "string",
  • "networkRef": "string",
  • "reference": "string",
  • "status": "string"
}

Reverse an authorization (0400)

Voids a still-open authorization and releases its memo hold (e.g. a cancelled sale). No posting ever occurred, so nothing is reversed on the ledger.

path Parameters
authId
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "amount": {
    },
  • "capturedAmount": {
    },
  • "cardId": "f16ba382-eb42-481a-b08f-c57bdc9aae24",
  • "channel": "string",
  • "createdAt": "string",
  • "declineReason": "string",
  • "expiresAt": "string",
  • "holdId": "05363803-5510-4d71-8d1f-307021f9ad73",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "mcc": "string",
  • "merchant": "string",
  • "messageType": "string",
  • "networkRef": "string",
  • "reference": "string",
  • "status": "string"
}

Loans

Loan origination, lifecycle management, repayment and IFRS-9 provisioning (lending operations). Covers the full loan lifecycle: application → approval → disbursement → repayment → closure or write-off. Approval and write-off are maker-checker controlled — the submitting user (maker) receives a 202 with a pending approval id, and a different user with loan:approve rights must confirm before the action executes. Reads require loan:read; origination requires loan:originate; state transitions require loan:approve or loan:repay; write-offs require loan:writeoff. Branch visibility is enforced on all read paths.

List loans

Returns a summary list of all loans visible to the caller's branch context. Loans belonging to branches the caller cannot see are silently excluded. Includes status, outstanding principal, and next-due amounts for each loan.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Originate a loan

Creates a new loan for the given borrower party against the specified disbursement account, using the configured loan product to derive the repayment schedule. The loan is stamped with the caller's branch context and starts in PENDING state awaiting approval. Returns 201 with the full loan view including the generated amortisation schedule. Requires loan:originate.

Request Body schema: application/json
required
annualRate
number >= 0
borrowerPartyId
required
string <uuid>
branchId
string <uuid>
disbursementAccountId
required
string <uuid>
frequency
required
string non-empty
required
object (MonetaryAmount)

A monetary amount as serialised by Jackson (JSR-354).

productId
string <uuid>
termMonths
integer <int32>

Responses

Request samples

Content type
application/json
{
  • "annualRate": 0,
  • "borrowerPartyId": "56224224-2e3f-481a-8833-e1de3e42077e",
  • "branchId": "712f308d-801e-48bc-b072-9c404734ceb7",
  • "disbursementAccountId": "a7910dc9-e839-4ef1-ad85-fab54d0e931e",
  • "frequency": "string",
  • "principal": {
    },
  • "productId": "dcd53ddb-8104-4e48-8cc0-5df1088c6113",
  • "termMonths": 0
}

Response samples

Content type
application/json
{
  • "accruedInterest": {
    },
  • "annualRate": 0,
  • "borrowerPartyId": "56224224-2e3f-481a-8833-e1de3e42077e",
  • "branchId": "712f308d-801e-48bc-b072-9c404734ceb7",
  • "currency": "string",
  • "disbursedOn": "string",
  • "disbursementAccountId": "a7910dc9-e839-4ef1-ad85-fab54d0e931e",
  • "frequency": "string",
  • "interestMethod": "string",
  • "loanId": "7f89c4c5-c1d0-4b4b-ae8c-fb112b2c21a4",
  • "outstandingPrincipal": {
    },
  • "penaltyAccrued": {
    },
  • "principal": {
    },
  • "productId": "dcd53ddb-8104-4e48-8cc0-5df1088c6113",
  • "provisionAllowance": {
    },
  • "reference": "string",
  • "rejectionReason": "string",
  • "repaymentMethod": "string",
  • "schedule": [
    ],
  • "stage": "string",
  • "status": "string",
  • "termMonths": 0,
  • "totalOutstanding": {
    }
}

Get a loan by id

Returns the full loan view — schedule, repayment history, outstanding balances and IFRS-9 provision data — for the specified loan. Returns 404 if no loan exists with that id or if the loan belongs to a branch the caller cannot see.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "accruedInterest": {
    },
  • "annualRate": 0,
  • "borrowerPartyId": "56224224-2e3f-481a-8833-e1de3e42077e",
  • "branchId": "712f308d-801e-48bc-b072-9c404734ceb7",
  • "currency": "string",
  • "disbursedOn": "string",
  • "disbursementAccountId": "a7910dc9-e839-4ef1-ad85-fab54d0e931e",
  • "frequency": "string",
  • "interestMethod": "string",
  • "loanId": "7f89c4c5-c1d0-4b4b-ae8c-fb112b2c21a4",
  • "outstandingPrincipal": {
    },
  • "penaltyAccrued": {
    },
  • "principal": {
    },
  • "productId": "dcd53ddb-8104-4e48-8cc0-5df1088c6113",
  • "provisionAllowance": {
    },
  • "reference": "string",
  • "rejectionReason": "string",
  • "repaymentMethod": "string",
  • "schedule": [
    ],
  • "stage": "string",
  • "status": "string",
  • "termMonths": 0,
  • "totalOutstanding": {
    }
}

Submit loan for approval

Submits a PENDING loan through the maker-checker approval workflow. If policy permits same-user execution (e.g. auto-approve below a threshold), the loan moves to APPROVED and 200 is returned with the updated loan view. Otherwise the operation is parked and 202 Accepted is returned with status PENDING_APPROVAL and the approvalId; a different user with loan:approve must then confirm via the approvals API. Requires loan:approve.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{ }

Assess IFRS-9 provision for a loan

Runs the product-configured IFRS-9 Expected Credit Loss (ECL) provisioning model for the specified loan, calculating the Stage (1/2/3), Probability of Default, Loss Given Default, and the resulting provision amount. The computed provision is persisted against the loan and the corresponding provision accounting entry is posted. Returns the updated loan view with the refreshed provision data. Requires loan:approve.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "accruedInterest": {
    },
  • "annualRate": 0,
  • "borrowerPartyId": "56224224-2e3f-481a-8833-e1de3e42077e",
  • "branchId": "712f308d-801e-48bc-b072-9c404734ceb7",
  • "currency": "string",
  • "disbursedOn": "string",
  • "disbursementAccountId": "a7910dc9-e839-4ef1-ad85-fab54d0e931e",
  • "frequency": "string",
  • "interestMethod": "string",
  • "loanId": "7f89c4c5-c1d0-4b4b-ae8c-fb112b2c21a4",
  • "outstandingPrincipal": {
    },
  • "penaltyAccrued": {
    },
  • "principal": {
    },
  • "productId": "dcd53ddb-8104-4e48-8cc0-5df1088c6113",
  • "provisionAllowance": {
    },
  • "reference": "string",
  • "rejectionReason": "string",
  • "repaymentMethod": "string",
  • "schedule": [
    ],
  • "stage": "string",
  • "status": "string",
  • "termMonths": 0,
  • "totalOutstanding": {
    }
}

Disburse a loan

Moves an APPROVED loan to ACTIVE and triggers the disbursement posting to the borrower's nominated account. The principal is posted as a debit to the loan asset account and a credit to the disbursement account. The repayment schedule becomes effective from this point. Requires loan:approve.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "accruedInterest": {
    },
  • "annualRate": 0,
  • "borrowerPartyId": "56224224-2e3f-481a-8833-e1de3e42077e",
  • "branchId": "712f308d-801e-48bc-b072-9c404734ceb7",
  • "currency": "string",
  • "disbursedOn": "string",
  • "disbursementAccountId": "a7910dc9-e839-4ef1-ad85-fab54d0e931e",
  • "frequency": "string",
  • "interestMethod": "string",
  • "loanId": "7f89c4c5-c1d0-4b4b-ae8c-fb112b2c21a4",
  • "outstandingPrincipal": {
    },
  • "penaltyAccrued": {
    },
  • "principal": {
    },
  • "productId": "dcd53ddb-8104-4e48-8cc0-5df1088c6113",
  • "provisionAllowance": {
    },
  • "reference": "string",
  • "rejectionReason": "string",
  • "repaymentMethod": "string",
  • "schedule": [
    ],
  • "stage": "string",
  • "status": "string",
  • "termMonths": 0,
  • "totalOutstanding": {
    }
}

Reject a loan application

Moves a PENDING loan to REJECTED, recording an optional decline reason. A rejected loan cannot be reactivated. Returns the updated loan view. Requires loan:approve.

path Parameters
id
required
string <uuid>
query Parameters
reason
string

Optional decline reason to record against the loan

Responses

Response samples

Content type
application/json
{
  • "accruedInterest": {
    },
  • "annualRate": 0,
  • "borrowerPartyId": "56224224-2e3f-481a-8833-e1de3e42077e",
  • "branchId": "712f308d-801e-48bc-b072-9c404734ceb7",
  • "currency": "string",
  • "disbursedOn": "string",
  • "disbursementAccountId": "a7910dc9-e839-4ef1-ad85-fab54d0e931e",
  • "frequency": "string",
  • "interestMethod": "string",
  • "loanId": "7f89c4c5-c1d0-4b4b-ae8c-fb112b2c21a4",
  • "outstandingPrincipal": {
    },
  • "penaltyAccrued": {
    },
  • "principal": {
    },
  • "productId": "dcd53ddb-8104-4e48-8cc0-5df1088c6113",
  • "provisionAllowance": {
    },
  • "reference": "string",
  • "rejectionReason": "string",
  • "repaymentMethod": "string",
  • "schedule": [
    ],
  • "stage": "string",
  • "status": "string",
  • "termMonths": 0,
  • "totalOutstanding": {
    }
}

Record a loan repayment

Applies a repayment amount against the loan, allocating first to accrued interest then to outstanding principal per the amortisation schedule. Posts the corresponding accounting entries (debit cash/settlement account, credit loan asset and interest income). Returns the updated loan view reflecting the new outstanding balance and schedule position. The loan moves to CLOSED automatically when outstanding principal reaches zero. Requires loan:repay.

path Parameters
id
required
string <uuid>
query Parameters
amount
required
number

Repayment amount (must be positive)

currency
required
string

ISO-4217 currency code, e.g. USD or ZWG

Responses

Response samples

Content type
application/json
{
  • "accruedInterest": {
    },
  • "annualRate": 0,
  • "borrowerPartyId": "56224224-2e3f-481a-8833-e1de3e42077e",
  • "branchId": "712f308d-801e-48bc-b072-9c404734ceb7",
  • "currency": "string",
  • "disbursedOn": "string",
  • "disbursementAccountId": "a7910dc9-e839-4ef1-ad85-fab54d0e931e",
  • "frequency": "string",
  • "interestMethod": "string",
  • "loanId": "7f89c4c5-c1d0-4b4b-ae8c-fb112b2c21a4",
  • "outstandingPrincipal": {
    },
  • "penaltyAccrued": {
    },
  • "principal": {
    },
  • "productId": "dcd53ddb-8104-4e48-8cc0-5df1088c6113",
  • "provisionAllowance": {
    },
  • "reference": "string",
  • "rejectionReason": "string",
  • "repaymentMethod": "string",
  • "schedule": [
    ],
  • "stage": "string",
  • "status": "string",
  • "termMonths": 0,
  • "totalOutstanding": {
    }
}

Submit loan write-off for approval

Submits a write-off of the outstanding principal through the maker-checker approval workflow. If policy permits direct execution the loan is written off immediately and 200 is returned with the updated loan view (outstanding principal = 0, status WRITTEN_OFF). Otherwise the operation is parked and 202 Accepted is returned with status PENDING_APPROVAL and the approvalId; a different user with loan:writeoff rights must confirm. Write-off posts the corresponding credit-loss accounting entries on execution. Requires loan:writeoff.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{ }

Roles

Role catalog management. Roles are named permission bundles assigned to users within the IAM context. Any authenticated staff member may read the catalog; creating, updating, or deactivating roles requires the admin:users authority. A deactivated role remains in the catalog but can no longer be assigned to new users.

List all roles

Returns every role in the catalog, including inactive ones, with their code, display name, and permission set.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create a role

Creates a new role in the catalog with a unique code, display name, and an initial permission set. The code must be unique across all roles. Returns 201 with the newly created role on success. Requires the admin:users authority.

Request Body schema: application/json
required
branchBound
boolean
code
required
string non-empty
displayName
required
string non-empty
permissions
Array of strings
tier
string

Responses

Request samples

Content type
application/json
{
  • "branchBound": true,
  • "code": "string",
  • "displayName": "string",
  • "permissions": [
    ],
  • "tier": "string"
}

Response samples

Content type
application/json
{
  • "branchBound": true,
  • "code": "string",
  • "displayName": "string",
  • "permissions": [
    ],
  • "status": "string",
  • "tier": "string"
}

Get a role by code

Returns one role identified by its unique code. Returns 404 if no role with that code exists.

path Parameters
code
required
string

Unique role code (e.g. TELLER, BRANCH_MANAGER)

Responses

Response samples

Content type
application/json
{
  • "branchBound": true,
  • "code": "string",
  • "displayName": "string",
  • "permissions": [
    ],
  • "status": "string",
  • "tier": "string"
}

Update a role

Fully replaces a role's display name and permission set. The role code itself is immutable. Returns the updated role view. Returns 404 if the role does not exist. Requires the admin:users authority.

path Parameters
code
required
string

Unique role code identifying the role to update

Request Body schema: application/json
required
branchBound
boolean
displayName
required
string non-empty
permissions
Array of strings
tier
string

Responses

Request samples

Content type
application/json
{
  • "branchBound": true,
  • "displayName": "string",
  • "permissions": [
    ],
  • "tier": "string"
}

Response samples

Content type
application/json
{
  • "branchBound": true,
  • "code": "string",
  • "displayName": "string",
  • "permissions": [
    ],
  • "status": "string",
  • "tier": "string"
}

Deactivate a role

Marks a role as inactive so it can no longer be assigned to users. Existing user-role assignments are not removed, but the role will not grant permissions once deactivated (enforcement depends on the IAM evaluation policy). Returns the updated role view with its inactive status. Requires the admin:users authority.

path Parameters
code
required
string

Unique role code identifying the role to deactivate

Responses

Response samples

Content type
application/json
{
  • "branchBound": true,
  • "code": "string",
  • "displayName": "string",
  • "permissions": [
    ],
  • "status": "string",
  • "tier": "string"
}

AML Alerts

AML transaction-monitoring alerts raised by the rule engine and their disposition workflow. Reads (list, get) require aml:read. Alert disposition actions (review, clear, escalate) require aml:operate and record the acting analyst's identity for audit trail.

List AML alerts

Returns all AML alerts, optionally filtered to a single status value (e.g. OPEN, UNDER_REVIEW, CLEARED, ESCALATED). Pass no status parameter to retrieve alerts in every state.

query Parameters
status
string

Filter by alert status (e.g. OPEN, UNDER_REVIEW, CLEARED, ESCALATED). Omit to return all alerts.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Get an AML alert by id

Returns a single AML alert by its id, or 404 if no alert has that id.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "accountId": "3d07c219-0a88-45be-9cfc-91e9d095a1e9",
  • "alertId": "a9367074-b5c3-42c4-9be4-be129f43577e",
  • "businessDate": "string",
  • "disposedBy": "string",
  • "disposition": "string",
  • "narrative": "string",
  • "partyId": "950a3d1f-4657-4e7b-87db-3ff5fa95b5c0",
  • "raisedAt": "string",
  • "ruleCode": "string",
  • "ruleType": "string",
  • "severity": "string",
  • "status": "string",
  • "triggeringTxnIds": [
    ]
}

Clear an AML alert

Resolves the alert as a false positive or no-action, transitioning it to CLEARED. An optional reason may be supplied in the request body as { "reason": "..." } and is persisted to the audit trail alongside the clearing analyst's identity. Requires aml:operate.

path Parameters
id
required
string <uuid>
Request Body schema: application/json
property name*
additional property
string

Responses

Request samples

Content type
application/json
{
  • "property1": "string",
  • "property2": "string"
}

Response samples

Content type
application/json
{
  • "error": "string",
  • "fieldErrors": {
    },
  • "message": "string"
}

Escalate an AML alert

Escalates the alert (e.g. for STR filing or senior review), transitioning it to ESCALATED. An optional reason may be supplied in the request body as { "reason": "..." } and is persisted to the audit trail alongside the escalating analyst's identity. Requires aml:operate.

path Parameters
id
required
string <uuid>
Request Body schema: application/json
property name*
additional property
string

Responses

Request samples

Content type
application/json
{
  • "property1": "string",
  • "property2": "string"
}

Response samples

Content type
application/json
{
  • "error": "string",
  • "fieldErrors": {
    },
  • "message": "string"
}

Mark alert as under review

Transitions the alert to UNDER_REVIEW, indicating that an analyst has taken ownership of it. The acting user's identity (from the JWT/session) is recorded for the audit trail. Requires aml:operate.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "error": "string",
  • "fieldErrors": {
    },
  • "message": "string"
}

Onboarding

Customer onboarding lifecycle — prospect registration, KYC document collection, sanctions/PEP screening, and final activation. Orchestrates the Party, Document, and Risk contexts behind a single process facade. All endpoints require the onboarding:process authority.

Start onboarding a prospect

Registers a new prospect party and opens the onboarding process. Returns 201 with the initial consolidated status view (identity details + document checklist + screening state + readiness flags). The returned partyId must be used for all subsequent onboarding steps. Not idempotent — each call creates a distinct party record.

Request Body schema: application/json
required
cddTier
required
string non-empty
displayName
required
string non-empty
type
required
string non-empty

Responses

Request samples

Content type
application/json
{
  • "cddTier": "string",
  • "displayName": "string",
  • "type": "string"
}

Response samples

Content type
application/json
{
  • "blockers": [
    ],
  • "cddTier": "string",
  • "checklist": [
    ],
  • "checklistComplete": true,
  • "displayName": "string",
  • "kycStatus": "string",
  • "partyId": "950a3d1f-4657-4e7b-87db-3ff5fa95b5c0",
  • "partyStatus": "string",
  • "readyToActivate": true,
  • "screeningPassed": true,
  • "screeningStatus": "string"
}

Get onboarding status

Returns the current consolidated onboarding state for the given party: identity data, document checklist progress, screening outcome, and overall readiness to complete. Safe/idempotent read — no state transitions are triggered.

path Parameters
partyId
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "blockers": [
    ],
  • "cddTier": "string",
  • "checklist": [
    ],
  • "checklistComplete": true,
  • "displayName": "string",
  • "kycStatus": "string",
  • "partyId": "950a3d1f-4657-4e7b-87db-3ff5fa95b5c0",
  • "partyStatus": "string",
  • "readyToActivate": true,
  • "screeningPassed": true,
  • "screeningStatus": "string"
}

Complete onboarding and activate the party

Activates the prospect party once all onboarding prerequisites are met (documents verified, screening passed, checklist complete). Records the operator or system identity that authorised activation via the 'by' parameter. Throws OnboardingBlockedException (400/422) if any prerequisite is unmet. Returns the final status view with the party in ACTIVE state.

path Parameters
partyId
required
string <uuid>
query Parameters
by
required
string

Username or system identifier of the officer completing onboarding

Responses

Response samples

Content type
application/json
{
  • "blockers": [
    ],
  • "cddTier": "string",
  • "checklist": [
    ],
  • "checklistComplete": true,
  • "displayName": "string",
  • "kycStatus": "string",
  • "partyId": "950a3d1f-4657-4e7b-87db-3ff5fa95b5c0",
  • "partyStatus": "string",
  • "readyToActivate": true,
  • "screeningPassed": true,
  • "screeningStatus": "string"
}

Run sanctions/PEP screening

Triggers a synchronous sanctions and politically-exposed-person (PEP) check against the party's identity data. Updates the party's screening record and returns the refreshed status view with the new screening outcome. Repeatable — a subsequent call re-runs the check and overwrites the previous result.

path Parameters
partyId
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "blockers": [
    ],
  • "cddTier": "string",
  • "checklist": [
    ],
  • "checklistComplete": true,
  • "displayName": "string",
  • "kycStatus": "string",
  • "partyId": "950a3d1f-4657-4e7b-87db-3ff5fa95b5c0",
  • "partyStatus": "string",
  • "readyToActivate": true,
  • "screeningPassed": true,
  • "screeningStatus": "string"
}

Pricing

Stateless interest and fee calculation engine — returns preview quotes without creating any ledger entries or persisting state. Intended for admin/staff product configuration previews, loan origination worksheets, and EOD batch drivers that need a rate quote before posting. All endpoints require product:read.

Quote fee

Calculates a fee amount given a fee type, applicable base amount and product configuration without persisting anything or posting to the ledger. Returns the computed fee and its breakdown so callers can present the charge to the customer or route it into a fee-posting use-case. Idempotent — repeated calls with identical input return identical output.

Request Body schema: application/json
required
baseAmount
number
feeType
string
fixedAmount
number
maxAmount
number
minAmount
number
rate
number

Responses

Request samples

Content type
application/json
{
  • "baseAmount": 0,
  • "feeType": "string",
  • "fixedAmount": 0,
  • "maxAmount": 0,
  • "minAmount": 0,
  • "rate": 0
}

Response samples

Content type
application/json
{
  • "fee": 0
}

Quote interest

Calculates an interest amount for the supplied principal, rate, day-count basis and term without persisting anything or posting to the ledger. The result is a stateless preview that callers (loan origination, deposit accrual preview, admin UI) can display or pass downstream to a posting use-case. Idempotent — repeated calls with identical input return identical output.

Request Body schema: application/json
required
annualRate
number
balance
number
dayCountBasis
string
days
integer <int32>
tiered
boolean
Array of objects (Band)

Responses

Request samples

Content type
application/json
{
  • "annualRate": 0,
  • "balance": 0,
  • "dayCountBasis": "string",
  • "days": 0,
  • "tiered": true,
  • "tiers": [
    ]
}

Response samples

Content type
application/json
{
  • "accruedInterest": 0,
  • "dayCountBasis": "string",
  • "days": 0
}

Reference Data — Code Lists

Manages code-list dictionaries (e.g. GENDER, COUNTRY, ID_TYPE, MARITAL_STATUS) used to populate dropdowns and validate enumerated fields across all staff forms. Code lists are low-sensitivity reference data: reads are open to any authenticated user; adding or deactivating values requires the reference:manage authority.

List code values for a code type

Returns all values in the specified code list. By default only active values are returned, suitable for populating form dropdowns. Pass includeInactive=true to retrieve the full catalogue including deactivated entries (e.g. for auditing or migration purposes).

path Parameters
codeType
required
string

Code list identifier (e.g. GENDER, COUNTRY, ID_TYPE)

query Parameters
includeInactive
boolean
Default: false

When true, deactivated values are included in the response alongside active ones

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Add a code value

Adds a new active value to the specified code list (e.g. adding a new country or ID-document type). The value is immediately visible to list callers. Requires reference:manage authority. Returns 201 Created with the persisted CodeValueView.

path Parameters
codeType
required
string

Code list identifier (e.g. GENDER, COUNTRY, ID_TYPE)

Request Body schema: application/json
required
code
required
string non-empty
name
required
string non-empty
parentCode
string
sortOrder
integer <int32>

Responses

Request samples

Content type
application/json
{
  • "code": "string",
  • "name": "string",
  • "parentCode": "string",
  • "sortOrder": 0
}

Response samples

Content type
application/json
{
  • "active": true,
  • "code": "string",
  • "codeType": "string",
  • "name": "string",
  • "parentCode": "string",
  • "sortOrder": 0
}

Deactivate a code value

Soft-deletes a specific value within a code list, hiding it from active dropdown queries without permanently removing it. Existing records that already reference the code are unaffected. The value can be re-examined via includeInactive=true on the list endpoint. Requires reference:manage authority. Returns 204 No Content on success.

path Parameters
codeType
required
string
code
required
string

Responses

Response samples

Content type
application/json
{
  • "error": "string",
  • "fieldErrors": {
    },
  • "message": "string"
}

Documents

Document storage, KYC checklist, verification, and lifecycle management (staff/compliance/operations). Supports upload, retrieval, streaming, and state transitions (verify, archive, legal-hold, soft-delete, purge) for any document attached to a CIF party or credit/account entity. Reads require document:read; all mutations (upload, lifecycle, verify) require document:write or document:verify as indicated.

List documents for an owner

Returns all documents associated with the given owner reference (party UUID or external ref), across all document types and statuses. Useful for presenting the full document history for a CIF party, account, or credit application.

query Parameters
ownerRef
required
string

Party or owner reference whose documents are to be listed

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Upload a document

Persists a new document (metadata + content) and returns the created DocumentView with status PENDING. The document is not yet verified; call POST /{id}/verify to approve or reject it. Requires document:write. Returns 201 Created.

Request Body schema: application/json
required
contentBase64
required
string non-empty
contentType
required
string non-empty
documentNumber
string
documentType
required
string non-empty
expiryDate
string <date>
fileName
required
string non-empty
issueDate
string <date>
issuingCountry
string
ownerRef
required
string non-empty
retainUntil
string <date>

Responses

Request samples

Content type
application/json
{
  • "contentBase64": "string",
  • "contentType": "string",
  • "documentNumber": "string",
  • "documentType": "string",
  • "expiryDate": "2019-08-24",
  • "fileName": "string",
  • "issueDate": "2019-08-24",
  • "issuingCountry": "string",
  • "ownerRef": "string",
  • "retainUntil": "2019-08-24"
}

Response samples

Content type
application/json
{
  • "capturedAt": "string",
  • "contentHash": "string",
  • "contentType": "string",
  • "deleted": true,
  • "documentNumber": "string",
  • "documentType": "string",
  • "expired": true,
  • "expiryDate": "string",
  • "fileName": "string",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "issueDate": "string",
  • "issuingCountry": "string",
  • "legalHold": true,
  • "ownerRef": "string",
  • "retainUntil": "string",
  • "scanStatus": "string",
  • "sizeBytes": 0,
  • "status": "string",
  • "supersedesId": "688cf67a-2e6c-4e49-8750-5bc8809fcd6f",
  • "verifiedAt": "string",
  • "verifiedBy": "string",
  • "versionNo": 0
}

Get KYC document checklist

Returns the required-document checklist for an owner (party reference) at a given Customer Due Diligence tier (e.g. BASIC, ENHANCED). Each checklist item shows the document type, whether it has been supplied, and whether a supplied copy has been verified. Used by onboarding and compliance workflows to determine documentation gaps.

query Parameters
ownerRef
required
string

Party or owner reference (e.g. CIF party UUID or external ref)

cddTier
required
string

CDD tier level, e.g. BASIC or ENHANCED

Responses

Response samples

Content type
application/json
{
  • "cddTier": "string",
  • "complete": true,
  • "items": [
    ],
  • "ownerRef": "string"
}

Permanently purge a document

Physically removes the document record and its stored content bytes from all stores. This is irreversible. The operation is refused (throws) if the document is currently on legal hold or if the regulatory retention period has not yet elapsed. Returns 204 No Content on success. Requires document:write.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "error": "string",
  • "fieldErrors": {
    },
  • "message": "string"
}

Get a document by id

Returns the DocumentView for the given id, or 404 if not found.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "capturedAt": "string",
  • "contentHash": "string",
  • "contentType": "string",
  • "deleted": true,
  • "documentNumber": "string",
  • "documentType": "string",
  • "expired": true,
  • "expiryDate": "string",
  • "fileName": "string",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "issueDate": "string",
  • "issuingCountry": "string",
  • "legalHold": true,
  • "ownerRef": "string",
  • "retainUntil": "string",
  • "scanStatus": "string",
  • "sizeBytes": 0,
  • "status": "string",
  • "supersedesId": "688cf67a-2e6c-4e49-8750-5bc8809fcd6f",
  • "verifiedAt": "string",
  • "verifiedBy": "string",
  • "versionNo": 0
}

Archive a document

Moves a document to the ARCHIVED state, indicating it is no longer active but must be retained for the regulatory retention period. Archived documents are read-only; they can still be downloaded and their content is preserved. Requires document:write.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "capturedAt": "string",
  • "contentHash": "string",
  • "contentType": "string",
  • "deleted": true,
  • "documentNumber": "string",
  • "documentType": "string",
  • "expired": true,
  • "expiryDate": "string",
  • "fileName": "string",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "issueDate": "string",
  • "issuingCountry": "string",
  • "legalHold": true,
  • "ownerRef": "string",
  • "retainUntil": "string",
  • "scanStatus": "string",
  • "sizeBytes": 0,
  • "status": "string",
  • "supersedesId": "688cf67a-2e6c-4e49-8750-5bc8809fcd6f",
  • "verifiedAt": "string",
  • "verifiedBy": "string",
  • "versionNo": 0
}

Download document content

Streams the raw document bytes from the configured content store (filesystem, S3, or DB BLOB). The response Content-Type mirrors the stored MIME type and the Content-Disposition header is set to attachment with the original file name, so browsers prompt a download. The document must not be purged.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
"string"

Soft-delete a document

Marks the document as deleted (logical deletion) and records the identity of the actor in 'by'. The document record and content are retained in storage for the retention period but are excluded from normal queries. A soft-deleted document cannot be further modified. Requires document:write.

path Parameters
id
required
string <uuid>
query Parameters
by
required
string

Username or staff ID of the person requesting deletion

Responses

Response samples

Content type
application/json
{
  • "capturedAt": "string",
  • "contentHash": "string",
  • "contentType": "string",
  • "deleted": true,
  • "documentNumber": "string",
  • "documentType": "string",
  • "expired": true,
  • "expiryDate": "string",
  • "fileName": "string",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "issueDate": "string",
  • "issuingCountry": "string",
  • "legalHold": true,
  • "ownerRef": "string",
  • "retainUntil": "string",
  • "scanStatus": "string",
  • "sizeBytes": 0,
  • "status": "string",
  • "supersedesId": "688cf67a-2e6c-4e49-8750-5bc8809fcd6f",
  • "verifiedAt": "string",
  • "verifiedBy": "string",
  • "versionNo": 0
}

Place a document on legal hold

Applies a legal hold flag to the document, preventing archival, soft-deletion, and purge until the hold is released. Typically triggered by a litigation or regulatory preservation notice. Requires document:write.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "capturedAt": "string",
  • "contentHash": "string",
  • "contentType": "string",
  • "deleted": true,
  • "documentNumber": "string",
  • "documentType": "string",
  • "expired": true,
  • "expiryDate": "string",
  • "fileName": "string",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "issueDate": "string",
  • "issuingCountry": "string",
  • "legalHold": true,
  • "ownerRef": "string",
  • "retainUntil": "string",
  • "scanStatus": "string",
  • "sizeBytes": 0,
  • "status": "string",
  • "supersedesId": "688cf67a-2e6c-4e49-8750-5bc8809fcd6f",
  • "verifiedAt": "string",
  • "verifiedBy": "string",
  • "versionNo": 0
}

Release a document from legal hold

Removes the legal hold flag, allowing the document to proceed through normal lifecycle transitions (archive, soft-delete, purge) again. Requires document:write.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "capturedAt": "string",
  • "contentHash": "string",
  • "contentType": "string",
  • "deleted": true,
  • "documentNumber": "string",
  • "documentType": "string",
  • "expired": true,
  • "expiryDate": "string",
  • "fileName": "string",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "issueDate": "string",
  • "issuingCountry": "string",
  • "legalHold": true,
  • "ownerRef": "string",
  • "retainUntil": "string",
  • "scanStatus": "string",
  • "sizeBytes": 0,
  • "status": "string",
  • "supersedesId": "688cf67a-2e6c-4e49-8750-5bc8809fcd6f",
  • "verifiedAt": "string",
  • "verifiedBy": "string",
  • "versionNo": 0
}

Verify or reject a document

Records an approval or rejection decision on a PENDING document. When approved=true the document transitions to VERIFIED; when false it transitions to REJECTED. The verifier identity is captured via the 'by' parameter for audit. Returns the updated DocumentView. Requires document:verify.

path Parameters
id
required
string <uuid>
query Parameters
approved
required
boolean

true to approve, false to reject

by
required
string

Username or staff ID of the person performing verification

Responses

Response samples

Content type
application/json
{
  • "capturedAt": "string",
  • "contentHash": "string",
  • "contentType": "string",
  • "deleted": true,
  • "documentNumber": "string",
  • "documentType": "string",
  • "expired": true,
  • "expiryDate": "string",
  • "fileName": "string",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "issueDate": "string",
  • "issuingCountry": "string",
  • "legalHold": true,
  • "ownerRef": "string",
  • "retainUntil": "string",
  • "scanStatus": "string",
  • "sizeBytes": 0,
  • "status": "string",
  • "supersedesId": "688cf67a-2e6c-4e49-8750-5bc8809fcd6f",
  • "verifiedAt": "string",
  • "verifiedBy": "string",
  • "versionNo": 0
}

AML Reports

Regulatory reporting surfaces for Anti-Money-Laundering compliance. Exposes read-only report views consumed by compliance officers and automated regulatory-submission pipelines. All endpoints require the aml:report authority; no write operations are exposed here — alerts and cases are managed through the AML case-management context.

List Currency Transaction Reports

Returns all Currency Transaction Report (CTR) records whose transaction date falls within the inclusive [from, to] date range. CTRs cover cash transactions that meet or exceed the regulatory reporting threshold (typically USD 10 000 equivalent). The list is used by compliance officers to prepare submissions to the Financial Intelligence Unit (FIU). Read-only; no side effects.

query Parameters
from
required
string <date>

Inclusive start date (ISO-8601, e.g. 2024-01-01)

to
required
string <date>

Inclusive end date (ISO-8601, e.g. 2024-01-31)

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Get Suspicious Transaction Report by case

Returns the full Suspicious Transaction Report (STR) associated with a given AML case id. An STR is generated when an AML case is escalated and filed with the regulator. Returns 404 if no case with that id exists or no STR has been filed yet for that case. Read-only; no side effects.

path Parameters
caseId
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "alerts": [
    ],
  • "caseId": "af51d69f-996a-4891-a745-aadfcdec225a",
  • "generatedAt": "string",
  • "narrative": "string",
  • "partyId": "950a3d1f-4657-4e7b-87db-3ff5fa95b5c0",
  • "reference": "string"
}

Tax

Tax-rate registry and real-time tax computation. Maintains named tax rates (e.g. VAT, WHT) that are versioned by their short code; each rate can be activated or deactivated independently so that rate changes are auditable and reversible. The compute endpoint is used by other contexts (lending, fees, payments) to apply the correct effective rates to a monetary amount at transaction time. Reads require tax:read; create/activate/deactivate require tax:manage.

Compute tax on an amount

Applies one or more active tax rates to the monetary amount supplied in the command and returns a breakdown of each rate's contribution plus the aggregate tax total. This is a pure calculation — no postings or state changes occur. Used by lending, payments, and fee contexts at transaction time. Requires tax:read.

Request Body schema: application/json
required
baseAmount
number
taxCode
string

Responses

Request samples

Content type
application/json
{
  • "baseAmount": 0,
  • "taxCode": "string"
}

Response samples

Content type
application/json
{
  • "base": 0,
  • "grossAmount": 0,
  • "inclusive": true,
  • "netAmount": 0,
  • "rate": 0,
  • "taxAmount": 0,
  • "taxCode": "string",
  • "taxType": "string"
}

List all tax rates

Returns the full registry of tax rates (active and inactive) with their codes, percentages, and current status.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create a tax rate

Registers a new named tax rate in the system. The rate starts INACTIVE; call the activate endpoint to make it effective for computation. Returns 201 with the persisted rate view. Requires tax:manage.

Request Body schema: application/json
required
code
required
string non-empty
inclusive
boolean
name
required
string non-empty
rate
required
number
taxType
required
string non-empty

Responses

Request samples

Content type
application/json
{
  • "code": "string",
  • "inclusive": true,
  • "name": "string",
  • "rate": 0,
  • "taxType": "string"
}

Response samples

Content type
application/json
{
  • "active": true,
  • "code": "string",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "inclusive": true,
  • "name": "string",
  • "rate": 0,
  • "taxType": "string"
}

Get a tax rate by code

Returns a single tax rate identified by its short code (e.g. VAT, WHT15), or 404 if no rate with that code exists.

path Parameters
code
required
string

Short alphanumeric tax rate code, e.g. VAT or WHT15

Responses

Response samples

Content type
application/json
{
  • "active": true,
  • "code": "string",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "inclusive": true,
  • "name": "string",
  • "rate": 0,
  • "taxType": "string"
}

Activate a tax rate

Transitions a tax rate to ACTIVE status so that it is applied by the compute endpoint. Activating an already-active rate is a no-op. Returns the updated rate view. Requires tax:manage.

path Parameters
code
required
string

Short alphanumeric tax rate code to activate

Responses

Response samples

Content type
application/json
{
  • "active": true,
  • "code": "string",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "inclusive": true,
  • "name": "string",
  • "rate": 0,
  • "taxType": "string"
}

Deactivate a tax rate

Transitions a tax rate to INACTIVE status so that it is excluded from future computations. In-flight transactions already computed at this rate are unaffected. Deactivating an already-inactive rate is a no-op. Returns the updated rate view. Requires tax:manage.

path Parameters
code
required
string

Short alphanumeric tax rate code to deactivate

Responses

Response samples

Content type
application/json
{
  • "active": true,
  • "code": "string",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "inclusive": true,
  • "name": "string",
  • "rate": 0,
  • "taxType": "string"
}

End-of-Day (EOD)

EOD batch orchestration and audit. This API triggers the nightly close pipeline, which sequences accruals, provisioning, card settlement, fee posting, and business-date advance. It also exposes read access to past run records and the current business date. Reads require reporting:read; triggering a run requires eod:run.

Get current business date

Returns the bank's current open business date — the date that will be closed on the next successful EOD run.

Responses

Response samples

Content type
application/json
{
  • "businessDate": "string"
}

Trigger an EOD run

Executes the full end-of-day pipeline for the given business date (or the current business date when omitted). The pipeline sequences: interest accrual, IFRS-9 provisioning, card-settlement reclass, fee posting, and business-date advance. The call is synchronous and returns only after all steps complete. Re-triggering for a date that already has a successful run is rejected by the domain. Requires eod:run authority.

query Parameters
businessDate
string <date>

Business date to close (ISO-8601, e.g. 2025-12-31). Omit to close the current business date.

Responses

Response samples

Content type
application/json
{
  • "businessDate": "string",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "status": "string",
  • "steps": [
    ]
}

List all EOD runs

Returns the audit history of every EOD run in reverse-chronological order, including status, business date, and step timings.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Get an EOD run by id

Returns the full detail of one EOD run record, or 404 if the id is not found.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "businessDate": "string",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "status": "string",
  • "steps": [
    ]
}

Ledger

General ledger: double-entry journal posting, batch posting, reversals, and account balance queries. All writes that originate from a human operator are subject to maker-checker four-eyes control when the approvals gateway is present (monolith deployment) — they return 202 Accepted and only hit the GL on a checker's approval. System-generated postings from deposits or lending call the use cases in-process and bypass this gate. Reads require journal:read; posting requires journal:post; reversals require journal:reverse.

Get account balance

Returns the current ledger balance for the given account in the requested currency, including available balance, book balance, and any hold amounts. The balance is computed from posted journal entries; pending maker-checker items are not reflected. Requires journal:read authority.

path Parameters
accountId
required
string <uuid>
query Parameters
currency
required
string

ISO 4217 currency code (e.g. USD, ZWG) for the balance to retrieve

Responses

Response samples

Content type
application/json
{
  • "accountId": "3d07c219-0a88-45be-9cfc-91e9d095a1e9",
  • "baseNet": {
    },
  • "credits": {
    },
  • "currency": "string",
  • "debits": {
    },
  • "net": {
    }
}

List recent journal entries

Returns the most recent posted journal entries in descending chronological order, capped to the requested limit (min 1, max 500, default 100). Only entries already committed to the GL are returned — pending maker-checker approvals are not visible here.

query Parameters
limit
integer <int32>
Default: 100

Maximum number of entries to return (1–500, default 100)

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Post a manual journal entry

Captures a balanced double-entry journal. When the maker-checker approvals gateway is present (monolith deployment) the entry is parked for checker authorization and 202 Accepted is returned with an approvalId; the GL is only updated when a checker approves the request via the approvals context. In a standalone ledger deployment (no gateway) the entry is posted immediately and 201 Created is returned with the new entryId. The request body must contain balanced debit and credit lines. Requires journal:post authority.

Request Body schema: application/json
required
businessDate
string <date>
idempotencyKey
string
required
Array of objects (PostingCommand) non-empty
reference
string
valueDate
string <date>

Responses

Request samples

Content type
application/json
{
  • "businessDate": "2019-08-24",
  • "idempotencyKey": "string",
  • "lines": [
    ],
  • "reference": "string",
  • "valueDate": "2019-08-24"
}

Response samples

Content type
application/json
{ }

Post a batch of journal entries

Captures multiple balanced journal entries in a single atomic transaction. The same maker-checker gate applies as for a single entry: when the approvals gateway is present all entries in the batch are parked together under one approvalId (202 Accepted); on approval they are all posted atomically. Without the gateway they are committed immediately and 201 Created is returned with the list of new entryIds. The batch must contain at least one entry and every entry must be individually balanced. Requires journal:post authority.

Request Body schema: application/json
required
required
Array of objects (PostJournalEntryCommand) non-empty

Responses

Request samples

Content type
application/json
{
  • "entries": [
    ]
}

Response samples

Content type
application/json
{ }

Get a journal entry by id

Returns a single posted journal entry with all its posting lines. Returns 404 if no entry with the given id exists.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "businessDate": "2019-08-24",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "lines": [
    ],
  • "postedAt": "2019-08-24T14:15:22Z",
  • "reference": "string",
  • "reversalOf": "e31188c1-91d1-4ccc-981a-2c729bd751bc",
  • "sequenceNo": 0,
  • "status": "string",
  • "valueDate": "2019-08-24"
}

Reverse a journal entry

Creates a mirror-image reversal of the identified journal entry (each debit leg becomes a credit and vice versa), effectively cancelling it from the GL. This is a privileged correction operation. When the approvals gateway is present the reversal is submitted for four-eyes authorization (202 Accepted with an approvalId) and only executed by LedgerJournalExecutor on checker approval. In a standalone deployment it posts immediately and returns 201 Created with the new reversalEntryId. An optional free-text reason should be supplied for audit trail purposes. Requires journal:reverse authority.

path Parameters
id
required
string <uuid>
query Parameters
reason
string

Free-text reason for the reversal, recorded on the audit trail

Responses

Response samples

Content type
application/json
{ }

Deposit Accounts

Deposit account lifecycle, money movement, holds, mandates, interest and fee management (staff/operations). Accounts can be CURRENT, SAVINGS, or any other product-configured type. Balance mutations (deposit, withdraw, transfer, holds, fees, interest capitalization) each generate a double-entry ledger posting. Reads require account:read; state transitions and balance mutations require account:maintain; opening requires account:open; closing requires account:close. All reads are branch-scoped — callers only see accounts belonging to their branch.

List deposit accounts

Returns summary views of all deposit accounts visible to the caller's branch. Accounts belonging to other branches are silently filtered out by BranchContext.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Open a deposit account

Creates a new deposit account for the given party under the specified product and currency. The account is stamped with the caller's branch via BranchContext and starts in a pending/inactive state until explicitly activated. Returns 201 Created with the full account detail view.

Request Body schema: application/json
required
branchId
string <uuid>
currency
required
string non-empty
object (MonetaryAmount)

A monetary amount as serialised by Jackson (JSR-354).

ownerPartyId
required
string <uuid>
productId
required
string <uuid>
title
required
string non-empty

Responses

Request samples

Content type
application/json
{
  • "branchId": "712f308d-801e-48bc-b072-9c404734ceb7",
  • "currency": "string",
  • "overdraftLimit": {
    },
  • "ownerPartyId": "ed1b7cc4-458a-42b5-8fbd-7f0f4a9eba71",
  • "productId": "dcd53ddb-8104-4e48-8cc0-5df1088c6113",
  • "title": "string"
}

Response samples

Content type
application/json
{
  • "accountId": "3d07c219-0a88-45be-9cfc-91e9d095a1e9",
  • "accountNumber": "string",
  • "accruedInterest": {
    },
  • "available": {
    },
  • "balance": {
    },
  • "branchId": "712f308d-801e-48bc-b072-9c404734ceb7",
  • "currency": "string",
  • "holdTotal": {
    },
  • "holds": [
    ],
  • "mandates": [
    ],
  • "overdraftLimit": {
    },
  • "productId": "dcd53ddb-8104-4e48-8cc0-5df1088c6113",
  • "status": "string",
  • "title": "string"
}

Transfer funds between accounts

Atomically debits the source account and credits the destination account for the specified amount. Both accounts must be ACTIVE. Posts a matched DEBIT/CREDIT pair to the ledger. Returns 204 No Content on success. Not idempotent — duplicate calls will post duplicate entries.

Request Body schema: application/json
required
required
object (MonetaryAmount)

A monetary amount as serialised by Jackson (JSR-354).

beneficiaryId
string <uuid>
fromAccountId
required
string <uuid>
idempotencyKey
string
narrative
string
toAccountId
required
string <uuid>

Responses

Request samples

Content type
application/json
{
  • "amount": {
    },
  • "beneficiaryId": "410e5c37-9603-4e5b-81b1-7cb895f362e8",
  • "fromAccountId": "bfc0ca59-4255-47db-ba7f-bed1e37954c5",
  • "idempotencyKey": "string",
  • "narrative": "string",
  • "toAccountId": "a5e9f764-e2f6-4d69-81d7-69120b87b71e"
}

Response samples

Content type
application/json
{
  • "error": "string",
  • "fieldErrors": {
    },
  • "message": "string"
}

Get a deposit account

Returns the full detail view of a single deposit account including balances, status, product, mandates and active holds. Returns 404 if the account does not exist or belongs to a branch the caller cannot see.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "accountId": "3d07c219-0a88-45be-9cfc-91e9d095a1e9",
  • "accountNumber": "string",
  • "accruedInterest": {
    },
  • "available": {
    },
  • "balance": {
    },
  • "branchId": "712f308d-801e-48bc-b072-9c404734ceb7",
  • "currency": "string",
  • "holdTotal": {
    },
  • "holds": [
    ],
  • "mandates": [
    ],
  • "overdraftLimit": {
    },
  • "productId": "dcd53ddb-8104-4e48-8cc0-5df1088c6113",
  • "status": "string",
  • "title": "string"
}

Accrue interest

Runs interest accrual for the account over the specified number of days using the product's configured interest rate. Accrued interest is held in an accrual bucket and does not affect available balance until capitalized. Returns the updated account detail view.

path Parameters
id
required
string <uuid>
query Parameters
days
integer <int32>
Default: 1

Number of days to accrue interest for (default 1)

Responses

Response samples

Content type
application/json
{
  • "accountId": "3d07c219-0a88-45be-9cfc-91e9d095a1e9",
  • "accountNumber": "string",
  • "accruedInterest": {
    },
  • "available": {
    },
  • "balance": {
    },
  • "branchId": "712f308d-801e-48bc-b072-9c404734ceb7",
  • "currency": "string",
  • "holdTotal": {
    },
  • "holds": [
    ],
  • "mandates": [
    ],
  • "overdraftLimit": {
    },
  • "productId": "dcd53ddb-8104-4e48-8cc0-5df1088c6113",
  • "status": "string",
  • "title": "string"
}

Activate an account

Transitions the account from its initial/pending state to ACTIVE, enabling deposits, withdrawals and transfers. Returns the updated account detail view.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "accountId": "3d07c219-0a88-45be-9cfc-91e9d095a1e9",
  • "accountNumber": "string",
  • "accruedInterest": {
    },
  • "available": {
    },
  • "balance": {
    },
  • "branchId": "712f308d-801e-48bc-b072-9c404734ceb7",
  • "currency": "string",
  • "holdTotal": {
    },
  • "holds": [
    ],
  • "mandates": [
    ],
  • "overdraftLimit": {
    },
  • "productId": "dcd53ddb-8104-4e48-8cc0-5df1088c6113",
  • "status": "string",
  • "title": "string"
}

Block an account

Suspends the account (e.g. due to fraud, AML freeze or customer request), preventing all debit and credit movements until unblocked. Returns the updated account detail view.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "accountId": "3d07c219-0a88-45be-9cfc-91e9d095a1e9",
  • "accountNumber": "string",
  • "accruedInterest": {
    },
  • "available": {
    },
  • "balance": {
    },
  • "branchId": "712f308d-801e-48bc-b072-9c404734ceb7",
  • "currency": "string",
  • "holdTotal": {
    },
  • "holds": [
    ],
  • "mandates": [
    ],
  • "overdraftLimit": {
    },
  • "productId": "dcd53ddb-8104-4e48-8cc0-5df1088c6113",
  • "status": "string",
  • "title": "string"
}

Capitalize accrued interest

Posts the accumulated accrued interest to the account's ledger balance as a CREDIT entry, resetting the accrual bucket to zero. Typically run at month-end or quarter-end as part of EOD processing. Returns the updated account detail view.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "accountId": "3d07c219-0a88-45be-9cfc-91e9d095a1e9",
  • "accountNumber": "string",
  • "accruedInterest": {
    },
  • "available": {
    },
  • "balance": {
    },
  • "branchId": "712f308d-801e-48bc-b072-9c404734ceb7",
  • "currency": "string",
  • "holdTotal": {
    },
  • "holds": [
    ],
  • "mandates": [
    ],
  • "overdraftLimit": {
    },
  • "productId": "dcd53ddb-8104-4e48-8cc0-5df1088c6113",
  • "status": "string",
  • "title": "string"
}

Charge a fee

Debits a fee from the account and posts a DEBIT ledger entry under the fee income GL. The fee type and amount are specified in the request body. The account must be ACTIVE. Returns the updated account detail view.

path Parameters
id
required
string <uuid>
Request Body schema: application/json
required
object (MonetaryAmount)

A monetary amount as serialised by Jackson (JSR-354).

feeCode
required
string non-empty

Responses

Request samples

Content type
application/json
{
  • "base": {
    },
  • "feeCode": "string"
}

Response samples

Content type
application/json
{
  • "accountId": "3d07c219-0a88-45be-9cfc-91e9d095a1e9",
  • "accountNumber": "string",
  • "accruedInterest": {
    },
  • "available": {
    },
  • "balance": {
    },
  • "branchId": "712f308d-801e-48bc-b072-9c404734ceb7",
  • "currency": "string",
  • "holdTotal": {
    },
  • "holds": [
    ],
  • "mandates": [
    ],
  • "overdraftLimit": {
    },
  • "productId": "dcd53ddb-8104-4e48-8cc0-5df1088c6113",
  • "status": "string",
  • "title": "string"
}

Close an account

Permanently closes the account (terminal state). The account must have a zero balance before closing; any active holds must be released first. A closed account cannot be reopened. Requires account:close authority. Returns the updated account detail view.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "accountId": "3d07c219-0a88-45be-9cfc-91e9d095a1e9",
  • "accountNumber": "string",
  • "accruedInterest": {
    },
  • "available": {
    },
  • "balance": {
    },
  • "branchId": "712f308d-801e-48bc-b072-9c404734ceb7",
  • "currency": "string",
  • "holdTotal": {
    },
  • "holds": [
    ],
  • "mandates": [
    ],
  • "overdraftLimit": {
    },
  • "productId": "dcd53ddb-8104-4e48-8cc0-5df1088c6113",
  • "status": "string",
  • "title": "string"
}

Deposit funds

Credits the specified amount to the account's available balance and posts a CREDIT ledger entry. The account must be in ACTIVE status. Returns the updated account detail view.

path Parameters
id
required
string <uuid>
Request Body schema: application/json
required
required
object (MonetaryAmount)

A monetary amount as serialised by Jackson (JSR-354).

beneficiaryId
string <uuid>
channel
string
chargeTransactionCode
string
idempotencyKey
string
narrative
string

Responses

Request samples

Content type
application/json
{
  • "amount": {
    },
  • "beneficiaryId": "410e5c37-9603-4e5b-81b1-7cb895f362e8",
  • "channel": "string",
  • "chargeTransactionCode": "string",
  • "idempotencyKey": "string",
  • "narrative": "string"
}

Response samples

Content type
application/json
{
  • "accountId": "3d07c219-0a88-45be-9cfc-91e9d095a1e9",
  • "accountNumber": "string",
  • "accruedInterest": {
    },
  • "available": {
    },
  • "balance": {
    },
  • "branchId": "712f308d-801e-48bc-b072-9c404734ceb7",
  • "currency": "string",
  • "holdTotal": {
    },
  • "holds": [
    ],
  • "mandates": [
    ],
  • "overdraftLimit": {
    },
  • "productId": "dcd53ddb-8104-4e48-8cc0-5df1088c6113",
  • "status": "string",
  • "title": "string"
}

Freeze an account

Places the account in a FROZEN state — a stricter restriction than BLOCKED that typically reflects a court order or regulatory directive. Frozen accounts reject all credits and debits. Returns the updated account detail view.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "accountId": "3d07c219-0a88-45be-9cfc-91e9d095a1e9",
  • "accountNumber": "string",
  • "accruedInterest": {
    },
  • "available": {
    },
  • "balance": {
    },
  • "branchId": "712f308d-801e-48bc-b072-9c404734ceb7",
  • "currency": "string",
  • "holdTotal": {
    },
  • "holds": [
    ],
  • "mandates": [
    ],
  • "overdraftLimit": {
    },
  • "productId": "dcd53ddb-8104-4e48-8cc0-5df1088c6113",
  • "status": "string",
  • "title": "string"
}

Place a hold on available balance

Earmarks (ring-fences) a portion of the account's available balance for a specific purpose, such as a pending payment, guarantee, or collateral. The held amount reduces available balance but does not yet post a ledger entry. Returns the updated account detail view including the new hold.

path Parameters
id
required
string <uuid>
Request Body schema: application/json
required
required
object (MonetaryAmount)

A monetary amount as serialised by Jackson (JSR-354).

placedBy
string
reason
required
string non-empty

Responses

Request samples

Content type
application/json
{
  • "amount": {
    },
  • "placedBy": "string",
  • "reason": "string"
}

Response samples

Content type
application/json
{
  • "accountId": "3d07c219-0a88-45be-9cfc-91e9d095a1e9",
  • "accountNumber": "string",
  • "accruedInterest": {
    },
  • "available": {
    },
  • "balance": {
    },
  • "branchId": "712f308d-801e-48bc-b072-9c404734ceb7",
  • "currency": "string",
  • "holdTotal": {
    },
  • "holds": [
    ],
  • "mandates": [
    ],
  • "overdraftLimit": {
    },
  • "productId": "dcd53ddb-8104-4e48-8cc0-5df1088c6113",
  • "status": "string",
  • "title": "string"
}

Release a hold

Removes an active balance hold, returning the earmarked amount to available balance. Returns the updated account detail view.

path Parameters
id
required
string <uuid>
holdId
required
string <uuid>

ID of the hold to release

Responses

Response samples

Content type
application/json
{
  • "accountId": "3d07c219-0a88-45be-9cfc-91e9d095a1e9",
  • "accountNumber": "string",
  • "accruedInterest": {
    },
  • "available": {
    },
  • "balance": {
    },
  • "branchId": "712f308d-801e-48bc-b072-9c404734ceb7",
  • "currency": "string",
  • "holdTotal": {
    },
  • "holds": [
    ],
  • "mandates": [
    ],
  • "overdraftLimit": {
    },
  • "productId": "dcd53ddb-8104-4e48-8cc0-5df1088c6113",
  • "status": "string",
  • "title": "string"
}

Add a signing mandate

Adds a new mandate (authorized signatory or instruction) to the account. Mandates govern who may instruct debits or other account operations outside of direct teller/staff channels. Returns the updated account detail view with the new mandate included.

path Parameters
id
required
string <uuid>
Request Body schema: application/json
required
partyId
required
string <uuid>
role
required
string non-empty

Responses

Request samples

Content type
application/json
{
  • "partyId": "950a3d1f-4657-4e7b-87db-3ff5fa95b5c0",
  • "role": "string"
}

Response samples

Content type
application/json
{
  • "accountId": "3d07c219-0a88-45be-9cfc-91e9d095a1e9",
  • "accountNumber": "string",
  • "accruedInterest": {
    },
  • "available": {
    },
  • "balance": {
    },
  • "branchId": "712f308d-801e-48bc-b072-9c404734ceb7",
  • "currency": "string",
  • "holdTotal": {
    },
  • "holds": [
    ],
  • "mandates": [
    ],
  • "overdraftLimit": {
    },
  • "productId": "dcd53ddb-8104-4e48-8cc0-5df1088c6113",
  • "status": "string",
  • "title": "string"
}

Get account statement

Returns a formal account statement covering the inclusive date range [from, to]. Includes opening balance, all posted transactions within the period, and closing balance. Both dates are ISO-8601 (yyyy-MM-dd).

path Parameters
id
required
string <uuid>
query Parameters
from
required
string <date>

Statement start date (inclusive), ISO-8601 yyyy-MM-dd

to
required
string <date>

Statement end date (inclusive), ISO-8601 yyyy-MM-dd

Responses

Response samples

Content type
application/json
{
  • "accountId": "3d07c219-0a88-45be-9cfc-91e9d095a1e9",
  • "accountNumber": "string",
  • "closingBalance": {
    },
  • "currency": "string",
  • "fromDate": "string",
  • "lines": [
    ],
  • "openingBalance": {
    },
  • "toDate": "string",
  • "totalCredits": {
    },
  • "totalDebits": {
    }
}

List account transactions

Returns all posted ledger transactions for the account in chronological order, including deposits, withdrawals, transfers, fees and interest entries.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Unblock an account

Returns a BLOCKED account to ACTIVE status, re-enabling money movement. Returns the updated account detail view.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "accountId": "3d07c219-0a88-45be-9cfc-91e9d095a1e9",
  • "accountNumber": "string",
  • "accruedInterest": {
    },
  • "available": {
    },
  • "balance": {
    },
  • "branchId": "712f308d-801e-48bc-b072-9c404734ceb7",
  • "currency": "string",
  • "holdTotal": {
    },
  • "holds": [
    ],
  • "mandates": [
    ],
  • "overdraftLimit": {
    },
  • "productId": "dcd53ddb-8104-4e48-8cc0-5df1088c6113",
  • "status": "string",
  • "title": "string"
}

Withdraw funds

Debits the specified amount from the account's available balance and posts a DEBIT ledger entry. The account must be ACTIVE and have sufficient available balance (considering any active holds). Overdraft up to the configured limit is allowed where the product permits. Returns the updated account detail view.

path Parameters
id
required
string <uuid>
Request Body schema: application/json
required
required
object (MonetaryAmount)

A monetary amount as serialised by Jackson (JSR-354).

beneficiaryId
string <uuid>
channel
string
chargeTransactionCode
string
idempotencyKey
string
narrative
string

Responses

Request samples

Content type
application/json
{
  • "amount": {
    },
  • "beneficiaryId": "410e5c37-9603-4e5b-81b1-7cb895f362e8",
  • "channel": "string",
  • "chargeTransactionCode": "string",
  • "idempotencyKey": "string",
  • "narrative": "string"
}

Response samples

Content type
application/json
{
  • "accountId": "3d07c219-0a88-45be-9cfc-91e9d095a1e9",
  • "accountNumber": "string",
  • "accruedInterest": {
    },
  • "available": {
    },
  • "balance": {
    },
  • "branchId": "712f308d-801e-48bc-b072-9c404734ceb7",
  • "currency": "string",
  • "holdTotal": {
    },
  • "holds": [
    ],
  • "mandates": [
    ],
  • "overdraftLimit": {
    },
  • "productId": "dcd53ddb-8104-4e48-8cc0-5df1088c6113",
  • "status": "string",
  • "title": "string"
}

Charges

Charge catalog management (pricing / fee schedule). Each charge is identified by a short alphanumeric code and carries its amount, currency, charge type, and active/inactive status. Charges in the catalog are referenced by other contexts (loans, transactions, cards) when pricing events are applied. Reads are open to any authenticated staff member; creating, updating, and toggling active status require the pricing:manage authority.

List all charges

Returns the full charge catalog — both active and inactive entries — ordered by charge code.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create a charge

Adds a new charge to the catalog. The charge code must be unique; a conflict will be rejected. The new charge starts in ACTIVE status and is immediately available for referencing by other contexts. Requires pricing:manage authority.

Request Body schema: application/json
required
amount
number
bearerDefault
string
category
string
chargeCode
required
string non-empty
glPurpose
string
maxAmount
number
method
required
string non-empty
minAmount
number
name
required
string non-empty
rate
number
reversible
boolean
taxClass
string
waivable
boolean

Responses

Request samples

Content type
application/json
{
  • "amount": 0,
  • "bearerDefault": "string",
  • "category": "string",
  • "chargeCode": "string",
  • "glPurpose": "string",
  • "maxAmount": 0,
  • "method": "string",
  • "minAmount": 0,
  • "name": "string",
  • "rate": 0,
  • "reversible": true,
  • "taxClass": "string",
  • "waivable": true
}

Response samples

Content type
application/json
{
  • "active": true,
  • "amount": 0,
  • "bearerDefault": "string",
  • "category": "string",
  • "chargeCode": "string",
  • "glPurpose": "string",
  • "maxAmount": 0,
  • "method": "string",
  • "minAmount": 0,
  • "name": "string",
  • "rate": 0,
  • "reversible": true,
  • "taxClass": "string",
  • "waivable": true
}

Get a charge by code

Returns a single charge identified by its unique charge code. Returns 404 if no charge with that code exists in the catalog.

path Parameters
code
required
string

Unique alphanumeric charge code (e.g. TXN_FEE_USD)

Responses

Response samples

Content type
application/json
{
  • "active": true,
  • "amount": 0,
  • "bearerDefault": "string",
  • "category": "string",
  • "chargeCode": "string",
  • "glPurpose": "string",
  • "maxAmount": 0,
  • "method": "string",
  • "minAmount": 0,
  • "name": "string",
  • "rate": 0,
  • "reversible": true,
  • "taxClass": "string",
  • "waivable": true
}

Update a charge

Replaces the mutable fields (amount, currency, description, charge type) of an existing charge. The charge code itself is immutable and taken from the path. Returns 404 if the code does not exist. Active/inactive state is not affected — use the dedicated activate/deactivate endpoints for that. Requires pricing:manage authority.

path Parameters
code
required
string

Unique alphanumeric charge code identifying the charge to update

Request Body schema: application/json
required
amount
number
bearerDefault
string
category
string
chargeCode
required
string non-empty
glPurpose
string
maxAmount
number
method
required
string non-empty
minAmount
number
name
required
string non-empty
rate
number
reversible
boolean
taxClass
string
waivable
boolean

Responses

Request samples

Content type
application/json
{
  • "amount": 0,
  • "bearerDefault": "string",
  • "category": "string",
  • "chargeCode": "string",
  • "glPurpose": "string",
  • "maxAmount": 0,
  • "method": "string",
  • "minAmount": 0,
  • "name": "string",
  • "rate": 0,
  • "reversible": true,
  • "taxClass": "string",
  • "waivable": true
}

Response samples

Content type
application/json
{
  • "active": true,
  • "amount": 0,
  • "bearerDefault": "string",
  • "category": "string",
  • "chargeCode": "string",
  • "glPurpose": "string",
  • "maxAmount": 0,
  • "method": "string",
  • "minAmount": 0,
  • "name": "string",
  • "rate": 0,
  • "reversible": true,
  • "taxClass": "string",
  • "waivable": true
}

Activate a charge

Moves an INACTIVE charge back to ACTIVE status, making it available again for new pricing events. Idempotent-safe if the charge is already active. Returns the updated charge view. Requires pricing:manage authority.

path Parameters
code
required
string

Responses

Response samples

Content type
application/json
{
  • "active": true,
  • "amount": 0,
  • "bearerDefault": "string",
  • "category": "string",
  • "chargeCode": "string",
  • "glPurpose": "string",
  • "maxAmount": 0,
  • "method": "string",
  • "minAmount": 0,
  • "name": "string",
  • "rate": 0,
  • "reversible": true,
  • "taxClass": "string",
  • "waivable": true
}

Deactivate a charge

Moves a charge to INACTIVE status. Inactive charges are excluded from new pricing events but remain in the catalog for historical reference. Returns the updated charge view. Requires pricing:manage authority.

path Parameters
code
required
string

Responses

Response samples

Content type
application/json
{
  • "active": true,
  • "amount": 0,
  • "bearerDefault": "string",
  • "category": "string",
  • "chargeCode": "string",
  • "glPurpose": "string",
  • "maxAmount": 0,
  • "method": "string",
  • "minAmount": 0,
  • "name": "string",
  • "rate": 0,
  • "reversible": true,
  • "taxClass": "string",
  • "waivable": true
}

Payment Schemes

Reference catalog of payment rails (schemes) supported by the platform — e.g. RTGS, SWIFT, ZIPIT, VISA, Mastercard. Adding a new rail is a data operation on this resource, not a code change. Reads are available to any principal with payment:read; creating/updating and toggling active state require reference:manage.

List all payment schemes

Returns the full catalog of registered payment rails, both active and inactive.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create or update a payment scheme

Upserts a payment scheme: inserts it when the code does not yet exist, otherwise replaces its metadata (name, description, limits, fee rules, etc.). The scheme is created in an inactive state if new; existing state is preserved on update. Responds 201 Created in both cases.

Request Body schema: application/json
required
allowedCurrencies
Array of strings
connectorKey
string
name
required
string non-empty
requiredBeneficiaryFields
Array of strings
schemeCode
required
string non-empty
scope
required
string non-empty
screeningRequired
boolean
settlement
required
string non-empty
supportsInbound
boolean
supportsOutbound
boolean
transactionCodeIn
string
transactionCodeOut
string

Responses

Request samples

Content type
application/json
{
  • "allowedCurrencies": [
    ],
  • "connectorKey": "string",
  • "name": "string",
  • "requiredBeneficiaryFields": [
    ],
  • "schemeCode": "string",
  • "scope": "string",
  • "screeningRequired": true,
  • "settlement": "string",
  • "supportsInbound": true,
  • "supportsOutbound": true,
  • "transactionCodeIn": "string",
  • "transactionCodeOut": "string"
}

Response samples

Content type
application/json
{
  • "active": true,
  • "allowedCurrencies": [
    ],
  • "connectorKey": "string",
  • "name": "string",
  • "requiredBeneficiaryFields": [
    ],
  • "schemeCode": "string",
  • "scope": "string",
  • "screeningRequired": true,
  • "settlement": "string",
  • "supportsInbound": true,
  • "supportsOutbound": true,
  • "transactionCodeIn": "string",
  • "transactionCodeOut": "string"
}

Get a payment scheme by code

Returns a single payment scheme identified by its short code (e.g. "RTGS", "SWIFT"). Returns 404 if no scheme is registered under that code.

path Parameters
code
required
string

Short mnemonic code that uniquely identifies the payment rail (e.g. RTGS, SWIFT, ZIPIT).

Responses

Response samples

Content type
application/json
{
  • "active": true,
  • "allowedCurrencies": [
    ],
  • "connectorKey": "string",
  • "name": "string",
  • "requiredBeneficiaryFields": [
    ],
  • "schemeCode": "string",
  • "scope": "string",
  • "screeningRequired": true,
  • "settlement": "string",
  • "supportsInbound": true,
  • "supportsOutbound": true,
  • "transactionCodeIn": "string",
  • "transactionCodeOut": "string"
}

Activate a payment scheme

Marks the scheme as active so that payment orders may be routed over it. Only active schemes are selectable at payment-order origination. Safe to call on an already-active scheme.

path Parameters
code
required
string

Short mnemonic code of the scheme to activate.

Responses

Response samples

Content type
application/json
{
  • "error": "string",
  • "fieldErrors": {
    },
  • "message": "string"
}

Deactivate a payment scheme

Marks the scheme as inactive so that no new payment orders can be routed over it. In-flight orders already assigned to the scheme are not affected. Safe to call on an already-inactive scheme.

path Parameters
code
required
string

Short mnemonic code of the scheme to deactivate.

Responses

Response samples

Content type
application/json
{
  • "error": "string",
  • "fieldErrors": {
    },
  • "message": "string"
}

Funds Transfer

Initiates and tracks money movements between accounts (internal book transfers, intra-bank, and outbound external transfers). Transfers below the configured approval threshold settle inline and return 201 with the completed transfer record. Transfers at or above the threshold are submitted to the maker-checker approval workflow and return 202 with an approvalId; the transfer is replayed automatically when the checker approves. Outbound transfers (to an external account number or a beneficiary of type EXTERNAL) additionally require the transfer:outbound authority. Read access requires transfer:read; initiating a transfer requires transfer:operate.

List all transfers

Returns all funds transfers visible to the caller — both settled inline transfers and those pending or completed via the approval workflow.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Initiate a funds transfer

Submits a funds transfer instruction. Two outcomes are possible depending on the transfer amount relative to the configured approval threshold: • Below threshold — the transfer settles inline: accounts are debited/credited immediately and the completed TransferView is returned with HTTP 201. • At or above threshold — the instruction is routed to the maker-checker approval workflow and HTTP 202 is returned with the approvalId; the actual debit/credit occurs when a checker approves the request. Outbound transfers (externalAccountNumber supplied, or payeeId resolving to an EXTERNAL beneficiary) additionally require the transfer:outbound authority; absence of that authority yields 403 before any amount check.

Request Body schema: application/json
required
required
object (MonetaryAmount)

A monetary amount as serialised by Jackson (JSR-354).

channel
string
commissionBeneficiaryId
string <uuid>
creditorAccountId
string <uuid>
debtorAccountId
required
string <uuid>
externalAccountNumber
string
externalBankCode
string
externalName
string
idempotencyKey
string
narrative
string
payeeId
string <uuid>
rail
string

Responses

Request samples

Content type
application/json
{
  • "amount": {
    },
  • "channel": "string",
  • "commissionBeneficiaryId": "685a0a60-e9f6-4d44-a20e-f99579bec930",
  • "creditorAccountId": "0411bd28-c6c2-4498-8a47-b18d967449d7",
  • "debtorAccountId": "d9695c4c-f4a8-4c4e-b1b1-0b2201504693",
  • "externalAccountNumber": "string",
  • "externalBankCode": "string",
  • "externalName": "string",
  • "idempotencyKey": "string",
  • "narrative": "string",
  • "payeeId": "79417842-2e1e-4110-a361-89b9f39b36ed",
  • "rail": "string"
}

Response samples

Content type
application/json
{ }

Get a transfer by id

Returns the transfer record for the given id, or 404 if no transfer exists with that id.

path Parameters
id
required
string <uuid>

Transfer id

Responses

Response samples

Content type
application/json
{
  • "amount": {
    },
  • "channel": "string",
  • "createdAt": "string",
  • "createdBy": "string",
  • "creditorAccountId": "0411bd28-c6c2-4498-8a47-b18d967449d7",
  • "debtorAccountId": "d9695c4c-f4a8-4c4e-b1b1-0b2201504693",
  • "executionRef": "string",
  • "failureReason": "string",
  • "narrative": "string",
  • "payeeId": "79417842-2e1e-4110-a361-89b9f39b36ed",
  • "reference": "string",
  • "status": "string",
  • "transferId": "e240f72a-b0bc-4f57-ab86-5b78f1d8ea9b",
  • "type": "string"
}

Approval Policy

Admin REST over the authorization matrix (maker-checker rules) that governs every dual-control operation in the system. Each rule maps an operation type to the number and role of approvers required before the operation is committed. Reads require approval:view; creating, replacing, or removing rules requires admin:users — changes take effect immediately and apply to all pending and future approval requests.

List all approval rules

Returns the complete authorization matrix — every approval rule with its operation type, required approver count, and eligible approver roles.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create an approval rule

Adds a new rule to the authorization matrix. The rule binds an operation type to the minimum number of approvers and the role(s) permitted to approve it. Once created the rule governs all subsequent maker-checker requests of that operation type. Returns the generated rule id.

Request Body schema: application/json
required
minAmount
required
number
minTier
required
string non-empty
operation
required
string non-empty
requiredApprovals
integer <int32> >= 0

Responses

Request samples

Content type
application/json
{
  • "minAmount": 0,
  • "minTier": "string",
  • "operation": "string",
  • "requiredApprovals": 0
}

Response samples

Content type
application/json
{
  • "property1": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "property2": "497f6eca-6276-4993-bfeb-53cbbbba6f08"
}

Delete an approval rule

Permanently removes an approval rule from the authorization matrix. After deletion, operations of that type are no longer subject to maker-checker control. In-flight approval requests linked to the deleted rule may be rejected or auto-approved depending on system configuration. Returns 204 No Content on success.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "error": "string",
  • "fieldErrors": {
    },
  • "message": "string"
}

Replace an approval rule

Fully replaces an existing approval rule (all fields from the command body overwrite the stored rule). The change applies immediately — any pending approval request governed by this rule continues under the previous quorum until re-evaluated. Returns 204 No Content on success.

path Parameters
id
required
string <uuid>
Request Body schema: application/json
required
minAmount
required
number
minTier
required
string non-empty
operation
required
string non-empty
requiredApprovals
integer <int32> >= 0

Responses

Request samples

Content type
application/json
{
  • "minAmount": 0,
  • "minTier": "string",
  • "operation": "string",
  • "requiredApprovals": 0
}

Response samples

Content type
application/json
{
  • "error": "string",
  • "fieldErrors": {
    },
  • "message": "string"
}

Channel Enrolments

Staff-facing digital-banking onboarding (channel enrolment). Enrolment provisions a party for self-service digital access (mobile/internet banking). All operations require the channel:manage authority and run on the staff JWT chain.

List all channel enrolments

Returns every customer channel enrolment with its current status.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Enrol a customer for digital banking

Provisions a party for digital-channel access (mobile/internet banking). The command must reference a valid party in the CIF. On success the enrolment is created in a pending or active state depending on channel configuration. Returns 201 with the new enrolment view.

Request Body schema: application/json
required
channel
string
identifier
required
string non-empty
partyId
required
string <uuid>
secret
required
string non-empty

Responses

Request samples

Content type
application/json
{
  • "channel": "string",
  • "identifier": "string",
  • "partyId": "950a3d1f-4657-4e7b-87db-3ff5fa95b5c0",
  • "secret": "string"
}

Response samples

Content type
application/json
{
  • "channel": "string",
  • "failedAttempts": 0,
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "identifier": "string",
  • "partyId": "950a3d1f-4657-4e7b-87db-3ff5fa95b5c0",
  • "status": "string"
}

Unlock a customer's channel access

Clears a lock on an enrolled customer's digital-channel access (e.g. after too many failed PIN/password attempts). The party must already have an enrolment record; if the enrolment is not locked the call is a no-op.

path Parameters
partyId
required
string <uuid>

Party (customer) id whose channel access lock should be cleared

Responses

Response samples

Content type
application/json
{
  • "error": "string",
  • "fieldErrors": {
    },
  • "message": "string"
}

OTP

Issues and verifies one-time passcodes used for channel step-up authentication (e.g. transaction confirmation, sensitive-action re-auth). Each OTP is scoped to a party + purpose pair and is delivered as a SECURITY-class notification over the requested channel (SMS, email, push). All operations require the notification:operate authority.

Issue an OTP challenge

Generates a time-limited one-time passcode for the given party and purpose, persists the challenge, and dispatches it as a SECURITY notification over the requested channel (SMS / email / push). Returns an OtpChallengeView carrying the challenge id and channel metadata. Issuing a new OTP for the same party + purpose supersedes any prior pending challenge for that pair.

Request Body schema: application/json
required
channel
string
partyId
required
string <uuid>
purpose
required
string

Responses

Request samples

Content type
application/json
{
  • "channel": "string",
  • "partyId": "950a3d1f-4657-4e7b-87db-3ff5fa95b5c0",
  • "purpose": "string"
}

Response samples

Content type
application/json
{
  • "challengeId": "007cfdcc-a46d-4340-a4c6-216ec2e4009c",
  • "channel": "string",
  • "expiresAt": "string",
  • "partyId": "950a3d1f-4657-4e7b-87db-3ff5fa95b5c0",
  • "purpose": "string",
  • "status": "string"
}

Verify an OTP code

Checks whether the submitted code matches the stored challenge for the given partyId and purpose. Returns {"verified": true} on success, {"verified": false} on mismatch or expiry. A successful verification consumes the challenge (single-use). The request body must contain partyId (UUID string), purpose, and code.

Request Body schema: application/json
required
property name*
additional property
string

Responses

Request samples

Content type
application/json
{
  • "property1": "string",
  • "property2": "string"
}

Response samples

Content type
application/json
{
  • "property1": true,
  • "property2": true
}

Commission Accruals

Commission accrual lifecycle — query, settle, batch-sweep, and reverse fee income earned on transactions. Commissions are accrued when fee-bearing transactions are processed and later settled (posted to income) either individually or via a bulk sweep. Reads are open to any authenticated user; all mutations (settle/sweep/reverse) require the pricing:manage authority.

List commission accruals

Returns all commission accrual records, optionally filtered to a single beneficiary. When beneficiaryId is omitted every accrual across all beneficiaries is returned; when supplied only accruals belonging to that beneficiary are returned. Accruals include both unsettled (pending income) and already-settled entries.

query Parameters
beneficiaryId
string <uuid>

Restrict results to accruals for this beneficiary (agent, branch, or staff id); omit for all beneficiaries

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Reverse commissions for a transaction

Reverses all commission accruals associated with the given originating transaction reference, unwinding any income postings that were made. Designed for use when the underlying transaction is reversed or voided. Returns a map with key "reversed" and the count of accrual records reversed. Requires pricing:manage authority.

query Parameters
transactionRef
required
string

The originating transaction reference whose commissions should be reversed

Responses

Response samples

Content type
application/json
{
  • "property1": 0,
  • "property2": 0
}

Settle a commission accrual

Settles one or more individually specified commission accruals, posting the earned fee income to the appropriate income GL accounts. Each settled accrual transitions from PENDING to SETTLED and cannot be re-settled. Returns the list of settlement records created. Requires pricing:manage authority.

Request Body schema: application/json
required
beneficiaryId
required
string <uuid>
settlementAccountId
string <uuid>

Responses

Request samples

Content type
application/json
{
  • "beneficiaryId": "410e5c37-9603-4e5b-81b1-7cb895f362e8",
  • "settlementAccountId": "341894e0-9bf3-408a-9878-bf1204ed5fb2"
}

Response samples

Content type
application/json
[
  • {
    }
]

Sweep all due commission accruals

Bulk-settles every commission accrual that is due on or before the given asOf date (defaults to today when omitted). Each qualifying accrual is posted to income in a single batch run, transitioning from PENDING to SETTLED. Intended for the daily end-of-day commission-settlement job. Returns the full list of settlement records produced by the sweep. Requires pricing:manage authority.

query Parameters
asOf
string <date>

Cut-off date for the sweep; accruals due on or before this date are settled. Defaults to today.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Reference Data — Currencies

Currency directory shared across all contexts (deposits, lending, cards, FX). Every currency picker in a money form resolves against this catalogue. Reads are open to any authenticated user; registering a new currency or designating the institution base/reporting currency requires the reference:manage authority.

List all currencies

Returns the full catalogue of registered currencies. Available to any authenticated user.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Register a currency

Registers a new ISO 4217 currency in the catalogue. The currency code must be unique; attempting to register a duplicate code raises a domain exception. Returns 201 with the newly registered currency view. Requires reference:manage authority.

Request Body schema: application/json
required
code
required
string non-empty
name
required
string non-empty
scale
integer <int32>

Responses

Request samples

Content type
application/json
{
  • "code": "string",
  • "name": "string",
  • "scale": 0
}

Response samples

Content type
application/json
{
  • "base": true,
  • "code": "string",
  • "name": "string",
  • "scale": 0,
  • "status": "string"
}

Get a currency by code

Returns the currency with the given ISO 4217 code, or 404 if it has not been registered.

path Parameters
code
required
string

ISO 4217 currency code (e.g. USD, ZWG)

Responses

Response samples

Content type
application/json
{
  • "base": true,
  • "code": "string",
  • "name": "string",
  • "scale": 0,
  • "status": "string"
}

Set institution base currency

Designates the given currency as the institution's base/reporting currency. Any previously designated base currency is cleared atomically. The base currency is used for all regulatory reporting, ledger consolidation and FX revaluation. Returns the updated currency view. Requires reference:manage authority.

path Parameters
code
required
string

ISO 4217 code of the currency to designate as base

Responses

Response samples

Content type
application/json
{
  • "base": true,
  • "code": "string",
  • "name": "string",
  • "scale": 0,
  • "status": "string"
}

General Ledger

Chart of accounts management and GL account lifecycle (finance / back-office operations). Each GL account is identified by a unique alphanumeric code and carries a type (ASSET, LIABILITY, EQUITY, INCOME, EXPENSE) that governs which side of the ledger it sits on. Reads (list, get) require gl:read; account creation and state transitions (activate, deactivate) require gl:manage.

List all GL accounts

Returns every account in the chart of accounts with its code, name, type, and active status.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create a GL account

Creates a new account in the chart of accounts. The account code must be unique across the chart. The account is created in an INACTIVE state and must be explicitly activated before postings can be made against it. Returns 201 with the newly created account view.

Request Body schema: application/json
required
code
required
string non-empty
name
required
string non-empty
type
required
string non-empty

Responses

Request samples

Content type
application/json
{
  • "code": "string",
  • "name": "string",
  • "type": "string"
}

Response samples

Content type
application/json
{
  • "active": true,
  • "code": "string",
  • "ledgerAccountId": "8fd783bf-c51a-434f-9698-99f6050085a9",
  • "name": "string",
  • "type": "string"
}

Get a GL account by code

Returns a single GL account identified by its unique alphanumeric code, or 404 if no account with that code exists.

path Parameters
code
required
string

Unique alphanumeric GL account code (e.g. 1001, CASH-USD)

Responses

Response samples

Content type
application/json
{
  • "active": true,
  • "code": "string",
  • "ledgerAccountId": "8fd783bf-c51a-434f-9698-99f6050085a9",
  • "name": "string",
  • "type": "string"
}

Activate a GL account

Moves an INACTIVE GL account to ACTIVE, allowing journal postings to be made against it. Returns the updated account view. Has no effect (idempotent) if the account is already active.

path Parameters
code
required
string

GL account code to activate

Responses

Response samples

Content type
application/json
{
  • "active": true,
  • "code": "string",
  • "ledgerAccountId": "8fd783bf-c51a-434f-9698-99f6050085a9",
  • "name": "string",
  • "type": "string"
}

Deactivate a GL account

Moves an ACTIVE GL account to INACTIVE, preventing any further journal postings against it. Existing posted entries on the account are unaffected. Returns the updated account view.

path Parameters
code
required
string

GL account code to deactivate

Responses

Response samples

Content type
application/json
{
  • "active": true,
  • "code": "string",
  • "ledgerAccountId": "8fd783bf-c51a-434f-9698-99f6050085a9",
  • "name": "string",
  • "type": "string"
}

Transaction Codes

Master list of transaction codes used across the core-banking system to classify and label journal entries, ledger postings, and transaction records (e.g. CASH_DEP, WIRE_OUT, FEE_SERVICE). Downstream modules (payments, lending, deposits) resolve a code at posting time to derive GL category, narrative templates, and regulatory reporting buckets. All authenticated staff can read; creating, updating, or toggling active status requires the reference:manage authority.

List all transaction codes

Returns every transaction code in the reference master, including inactive ones. No pagination — the dataset is bounded and small.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create a transaction code

Creates a new transaction code in the reference master. The code value must be unique; a conflict results in a 409. On success the newly created record is returned with HTTP 201. Requires the reference:manage authority.

Request Body schema: application/json
required
category
string
code
required
string non-empty
name
required
string non-empty
reversalCode
string
taxable
boolean

Responses

Request samples

Content type
application/json
{
  • "category": "string",
  • "code": "string",
  • "name": "string",
  • "reversalCode": "string",
  • "taxable": true
}

Response samples

Content type
application/json
{
  • "active": true,
  • "category": "string",
  • "code": "string",
  • "name": "string",
  • "reversalCode": "string",
  • "taxable": true
}

Get a transaction code by code

Returns the single transaction code matching the given short code string. Returns 404 if no code with that identifier exists.

path Parameters
code
required
string

Short alphanumeric code that uniquely identifies the transaction code (e.g. CASH_DEP, WIRE_OUT).

Responses

Response samples

Content type
application/json
{
  • "active": true,
  • "category": "string",
  • "code": "string",
  • "name": "string",
  • "reversalCode": "string",
  • "taxable": true
}

Update a transaction code

Replaces the mutable fields (description, GL category, narrative template, etc.) of an existing transaction code. The code identifier itself is immutable. Returns the updated record. Returns 404 if the code does not exist. Requires the reference:manage authority.

path Parameters
code
required
string

Short alphanumeric code identifying the transaction code to update.

Request Body schema: application/json
required
category
string
name
required
string non-empty
reversalCode
string
taxable
boolean

Responses

Request samples

Content type
application/json
{
  • "category": "string",
  • "name": "string",
  • "reversalCode": "string",
  • "taxable": true
}

Response samples

Content type
application/json
{
  • "active": true,
  • "category": "string",
  • "code": "string",
  • "name": "string",
  • "reversalCode": "string",
  • "taxable": true
}

Activate a transaction code

Restores a previously deactivated transaction code to active status, making it selectable for new postings again. Safe to call on an already-active code (no-op on status). Returns the updated record. Returns 404 if the code does not exist. Requires the reference:manage authority.

path Parameters
code
required
string

Short alphanumeric code identifying the transaction code to activate.

Responses

Response samples

Content type
application/json
{
  • "active": true,
  • "category": "string",
  • "code": "string",
  • "name": "string",
  • "reversalCode": "string",
  • "taxable": true
}

Deactivate a transaction code

Marks the transaction code as inactive so it can no longer be selected for new postings. Existing historical records that reference the code are unaffected. Returns the updated record showing the inactive status. Returns 404 if the code does not exist. Requires the reference:manage authority.

path Parameters
code
required
string

Short alphanumeric code identifying the transaction code to deactivate.

Responses

Response samples

Content type
application/json
{
  • "active": true,
  • "category": "string",
  • "code": "string",
  • "name": "string",
  • "reversalCode": "string",
  • "taxable": true
}

Disputes

Card dispute lifecycle management (operations/back-office). Covers the full chargeback cycle: raising a dispute on a card transaction, issuing a provisional credit, filing a chargeback with the scheme, recording representment, escalating for arbitration, resolving with a ruling, and withdrawing a frivolous claim. Evidence attachments are tracked against the dispute record. Reads require dispute:read; all state transitions require dispute:operate. Operator identity is captured from the authenticated principal on every mutation.

List all disputes

Returns every dispute in the system regardless of status, ordered by creation date descending.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Raise a dispute

Opens a new dispute against a card transaction. The command must reference an existing card transaction and include a valid reason code. The dispute is created in RAISED status and the operator principal is recorded as the initiating actor. Returns 201 with the created dispute view.

Request Body schema: application/json
required
object (MonetaryAmount)

A monetary amount as serialised by Jackson (JSR-354).

cardTransactionId
required
string <uuid>
note
string
reasonCode
required
string non-empty

Responses

Request samples

Content type
application/json
{
  • "amount": {
    },
  • "cardTransactionId": "8918d1f2-5fb2-4486-a655-3c16bf91ce29",
  • "note": "string",
  • "reasonCode": "string"
}

Response samples

Content type
application/json
{
  • "amount": {
    },
  • "cardId": "f16ba382-eb42-481a-b08f-c57bdc9aae24",
  • "cardTransactionId": "8918d1f2-5fb2-4486-a655-3c16bf91ce29",
  • "cardholderPartyId": "1e61b784-773f-41b2-adfe-0a5d2a20fd48",
  • "category": "string",
  • "events": [
    ],
  • "evidence": [
    ],
  • "filingDeadline": "string",
  • "fundingAccountId": "2d58f397-b4d9-4f93-90cb-6efb6d145ec8",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "openedAt": "string",
  • "outcome": "string",
  • "provisionalCredit": "string",
  • "reasonCode": "string",
  • "reference": "string",
  • "representmentDeadline": "string",
  • "resolvedAmount": {
    },
  • "resolvedAt": "string",
  • "stage": "string"
}

List dispute reasons

Returns the catalogue of allowed dispute reason codes (e.g. unauthorised transaction, merchant error, duplicate charge). Used to populate reason dropdowns when raising a dispute.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Get a dispute by id

Returns the full dispute view including current status, timeline events and evidence list, or 404 if no dispute has that id.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "amount": {
    },
  • "cardId": "f16ba382-eb42-481a-b08f-c57bdc9aae24",
  • "cardTransactionId": "8918d1f2-5fb2-4486-a655-3c16bf91ce29",
  • "cardholderPartyId": "1e61b784-773f-41b2-adfe-0a5d2a20fd48",
  • "category": "string",
  • "events": [
    ],
  • "evidence": [
    ],
  • "filingDeadline": "string",
  • "fundingAccountId": "2d58f397-b4d9-4f93-90cb-6efb6d145ec8",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "openedAt": "string",
  • "outcome": "string",
  • "provisionalCredit": "string",
  • "reasonCode": "string",
  • "reference": "string",
  • "representmentDeadline": "string",
  • "resolvedAmount": {
    },
  • "resolvedAt": "string",
  • "stage": "string"
}

File a chargeback

Formally files a chargeback with the card scheme on behalf of the cardholder. Transitions the dispute to CHARGEBACK_FILED and records the scheme submission. The merchant has a representment window to rebut the chargeback before a ruling is issued.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "amount": {
    },
  • "cardId": "f16ba382-eb42-481a-b08f-c57bdc9aae24",
  • "cardTransactionId": "8918d1f2-5fb2-4486-a655-3c16bf91ce29",
  • "cardholderPartyId": "1e61b784-773f-41b2-adfe-0a5d2a20fd48",
  • "category": "string",
  • "events": [
    ],
  • "evidence": [
    ],
  • "filingDeadline": "string",
  • "fundingAccountId": "2d58f397-b4d9-4f93-90cb-6efb6d145ec8",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "openedAt": "string",
  • "outcome": "string",
  • "provisionalCredit": "string",
  • "reasonCode": "string",
  • "reference": "string",
  • "representmentDeadline": "string",
  • "resolvedAmount": {
    },
  • "resolvedAt": "string",
  • "stage": "string"
}

Escalate a dispute

Escalates the dispute to scheme arbitration when the representment rebuttal is unsatisfactory. Transitions the dispute to ESCALATED. Typically used after representment has been received and the bank intends to pursue the claim further through the scheme's second-presentment or arbitration process.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "amount": {
    },
  • "cardId": "f16ba382-eb42-481a-b08f-c57bdc9aae24",
  • "cardTransactionId": "8918d1f2-5fb2-4486-a655-3c16bf91ce29",
  • "cardholderPartyId": "1e61b784-773f-41b2-adfe-0a5d2a20fd48",
  • "category": "string",
  • "events": [
    ],
  • "evidence": [
    ],
  • "filingDeadline": "string",
  • "fundingAccountId": "2d58f397-b4d9-4f93-90cb-6efb6d145ec8",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "openedAt": "string",
  • "outcome": "string",
  • "provisionalCredit": "string",
  • "reasonCode": "string",
  • "reference": "string",
  • "representmentDeadline": "string",
  • "resolvedAmount": {
    },
  • "resolvedAt": "string",
  • "stage": "string"
}

Add evidence to a dispute

Attaches a piece of supporting evidence (e.g. transaction receipt, merchant correspondence, fraud indicator) to the dispute record. Multiple evidence items may be added over the dispute's lifetime. Evidence is stored against the dispute and included in the dispute view.

path Parameters
id
required
string <uuid>
Request Body schema: application/json
required
documentId
required
string non-empty
kind
required
string non-empty

Responses

Request samples

Content type
application/json
{
  • "documentId": "string",
  • "kind": "string"
}

Response samples

Content type
application/json
{
  • "amount": {
    },
  • "cardId": "f16ba382-eb42-481a-b08f-c57bdc9aae24",
  • "cardTransactionId": "8918d1f2-5fb2-4486-a655-3c16bf91ce29",
  • "cardholderPartyId": "1e61b784-773f-41b2-adfe-0a5d2a20fd48",
  • "category": "string",
  • "events": [
    ],
  • "evidence": [
    ],
  • "filingDeadline": "string",
  • "fundingAccountId": "2d58f397-b4d9-4f93-90cb-6efb6d145ec8",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "openedAt": "string",
  • "outcome": "string",
  • "provisionalCredit": "string",
  • "reasonCode": "string",
  • "reference": "string",
  • "representmentDeadline": "string",
  • "resolvedAmount": {
    },
  • "resolvedAt": "string",
  • "stage": "string"
}

Issue provisional credit

Credits the cardholder's account with a provisional (conditional) amount while the dispute is under investigation. Transitions the dispute to PROVISIONAL_CREDIT_ISSUED. The credit posting is reversed if the dispute is subsequently resolved in the merchant's favour.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "amount": {
    },
  • "cardId": "f16ba382-eb42-481a-b08f-c57bdc9aae24",
  • "cardTransactionId": "8918d1f2-5fb2-4486-a655-3c16bf91ce29",
  • "cardholderPartyId": "1e61b784-773f-41b2-adfe-0a5d2a20fd48",
  • "category": "string",
  • "events": [
    ],
  • "evidence": [
    ],
  • "filingDeadline": "string",
  • "fundingAccountId": "2d58f397-b4d9-4f93-90cb-6efb6d145ec8",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "openedAt": "string",
  • "outcome": "string",
  • "provisionalCredit": "string",
  • "reasonCode": "string",
  • "reference": "string",
  • "representmentDeadline": "string",
  • "resolvedAmount": {
    },
  • "resolvedAt": "string",
  • "stage": "string"
}

Record representment

Records the merchant's representment response after a chargeback has been filed. An optional note (e.g. scheme reference or merchant remarks) may be supplied in the request body as {"note": "..."}, otherwise the body may be omitted. Transitions the dispute to REPRESENTMENT_RECEIVED.

path Parameters
id
required
string <uuid>
Request Body schema: application/json
property name*
additional property
string

Responses

Request samples

Content type
application/json
{
  • "property1": "string",
  • "property2": "string"
}

Response samples

Content type
application/json
{
  • "amount": {
    },
  • "cardId": "f16ba382-eb42-481a-b08f-c57bdc9aae24",
  • "cardTransactionId": "8918d1f2-5fb2-4486-a655-3c16bf91ce29",
  • "cardholderPartyId": "1e61b784-773f-41b2-adfe-0a5d2a20fd48",
  • "category": "string",
  • "events": [
    ],
  • "evidence": [
    ],
  • "filingDeadline": "string",
  • "fundingAccountId": "2d58f397-b4d9-4f93-90cb-6efb6d145ec8",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "openedAt": "string",
  • "outcome": "string",
  • "provisionalCredit": "string",
  • "reasonCode": "string",
  • "reference": "string",
  • "representmentDeadline": "string",
  • "resolvedAmount": {
    },
  • "resolvedAt": "string",
  • "stage": "string"
}

Resolve a dispute

Records the final ruling on the dispute and transitions it to RESOLVED. The command must specify the resolution outcome (e.g. CARDHOLDER_WON, MERCHANT_WON). If a provisional credit was previously issued and the outcome favours the merchant, the reversal posting is triggered automatically.

path Parameters
id
required
string <uuid>
Request Body schema: application/json
required
note
string
outcome
required
string non-empty
object (MonetaryAmount)

A monetary amount as serialised by Jackson (JSR-354).

writeOff
boolean

Responses

Request samples

Content type
application/json
{
  • "note": "string",
  • "outcome": "string",
  • "resolvedAmount": {
    },
  • "writeOff": true
}

Response samples

Content type
application/json
{
  • "amount": {
    },
  • "cardId": "f16ba382-eb42-481a-b08f-c57bdc9aae24",
  • "cardTransactionId": "8918d1f2-5fb2-4486-a655-3c16bf91ce29",
  • "cardholderPartyId": "1e61b784-773f-41b2-adfe-0a5d2a20fd48",
  • "category": "string",
  • "events": [
    ],
  • "evidence": [
    ],
  • "filingDeadline": "string",
  • "fundingAccountId": "2d58f397-b4d9-4f93-90cb-6efb6d145ec8",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "openedAt": "string",
  • "outcome": "string",
  • "provisionalCredit": "string",
  • "reasonCode": "string",
  • "reference": "string",
  • "representmentDeadline": "string",
  • "resolvedAmount": {
    },
  • "resolvedAt": "string",
  • "stage": "string"
}

Withdraw a dispute

Withdraws an open dispute at the cardholder's request before a ruling is issued. Transitions the dispute to WITHDRAWN. If a provisional credit was issued it is reversed on withdrawal.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "amount": {
    },
  • "cardId": "f16ba382-eb42-481a-b08f-c57bdc9aae24",
  • "cardTransactionId": "8918d1f2-5fb2-4486-a655-3c16bf91ce29",
  • "cardholderPartyId": "1e61b784-773f-41b2-adfe-0a5d2a20fd48",
  • "category": "string",
  • "events": [
    ],
  • "evidence": [
    ],
  • "filingDeadline": "string",
  • "fundingAccountId": "2d58f397-b4d9-4f93-90cb-6efb6d145ec8",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "openedAt": "string",
  • "outcome": "string",
  • "provisionalCredit": "string",
  • "reasonCode": "string",
  • "reference": "string",
  • "representmentDeadline": "string",
  • "resolvedAmount": {
    },
  • "resolvedAt": "string",
  • "stage": "string"
}

Payments

Payments Hub — outbound initiation, inbound receipt, dispatch and settlement. Payments at or below the configured auto-approval limit settle immediately (201 Created). Payments above the limit are routed through maker-checker: the original command is serialised into an approval record and replayed on a checker's approval (202 Accepted). Reads require payment:read; initiation requires payment:initiate; settlement and dispatch operations require payment:settle.

List all payments

Returns all payments (inbound and outbound) visible to the caller, including their current status, amount, rail, and accounting references.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Initiate a payment

Initiates an outbound payment. If the amount is at or below the auto-approval limit the payment is submitted synchronously and the response is 201 Created with the settled PaymentView. If the amount exceeds the limit the command is serialised into the approval workflow: response is 202 Accepted with the approval status and approvalId — the payment is settled only after a checker approves. Requires payment:initiate authority.

Request Body schema: application/json
required
required
object (MonetaryAmount)

A monetary amount as serialised by Jackson (JSR-354).

beneficiaryAccount
string
beneficiaryName
required
string non-empty
creditorAccountId
string <uuid>
debtorAccountId
required
string <uuid>
idempotencyKey
string
narrative
string
rail
required
string non-empty
type
required
string non-empty

Responses

Request samples

Content type
application/json
{
  • "amount": {
    },
  • "beneficiaryAccount": "string",
  • "beneficiaryName": "string",
  • "creditorAccountId": "0411bd28-c6c2-4498-8a47-b18d967449d7",
  • "debtorAccountId": "d9695c4c-f4a8-4c4e-b1b1-0b2201504693",
  • "idempotencyKey": "string",
  • "narrative": "string",
  • "rail": "string",
  • "type": "string"
}

Response samples

Content type
application/json
{ }

Run payment dispatch

Triggers the payment dispatch batch: picks up all outbound instructions sitting in the outbox and dispatches them to their respective external rails. Returns a count of instructions dispatched in this run. Intended to be called by the scheduler or operations staff; safe to call manually for catch-up runs. Requires payment:settle authority.

Responses

Response samples

Content type
application/json
{
  • "property1": 0,
  • "property2": 0
}

Receive an inbound payment

Records an inbound payment arriving from an external rail (RTGS, SWIFT, local ACH, etc.). Credits the beneficiary's account and creates a settled PaymentView. Returns 201 Created. The rail reference and sender details must be provided in the command. Requires payment:initiate authority.

Request Body schema: application/json
required
required
object (MonetaryAmount)

A monetary amount as serialised by Jackson (JSR-354).

beneficiaryAccount
string
creditorAccountId
required
string <uuid>
idempotencyKey
string
narrative
string
rail
required
string non-empty
senderName
string

Responses

Request samples

Content type
application/json
{
  • "amount": {
    },
  • "beneficiaryAccount": "string",
  • "creditorAccountId": "0411bd28-c6c2-4498-8a47-b18d967449d7",
  • "idempotencyKey": "string",
  • "narrative": "string",
  • "rail": "string",
  • "senderName": "string"
}

Response samples

Content type
application/json
{
  • "amount": {
    },
  • "beneficiaryAccount": "string",
  • "beneficiaryName": "string",
  • "creditorAccountId": "0411bd28-c6c2-4498-8a47-b18d967449d7",
  • "debtorAccountId": "d9695c4c-f4a8-4c4e-b1b1-0b2201504693",
  • "failureReason": "string",
  • "narrative": "string",
  • "networkRef": "string",
  • "paymentId": "472e651e-5a1e-424d-8098-23858bf03ad7",
  • "rail": "string",
  • "reference": "string",
  • "screeningId": "c70fa460-d553-485e-9f44-b600a5be39b1",
  • "status": "string",
  • "type": "string"
}

List dispatch outbox

Returns all pending dispatch instructions (outbound payments queued for rail transmission but not yet dispatched). Used by operations to monitor the outbox queue ahead of or after a dispatch run.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Get a payment by id

Returns a single payment by its UUID, or 404 if not found.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "amount": {
    },
  • "beneficiaryAccount": "string",
  • "beneficiaryName": "string",
  • "creditorAccountId": "0411bd28-c6c2-4498-8a47-b18d967449d7",
  • "debtorAccountId": "d9695c4c-f4a8-4c4e-b1b1-0b2201504693",
  • "failureReason": "string",
  • "narrative": "string",
  • "networkRef": "string",
  • "paymentId": "472e651e-5a1e-424d-8098-23858bf03ad7",
  • "rail": "string",
  • "reference": "string",
  • "screeningId": "c70fa460-d553-485e-9f44-b600a5be39b1",
  • "status": "string",
  • "type": "string"
}

Return a payment

Returns (reverses) a previously settled payment, debiting the beneficiary and crediting the original sender. An optional JSON body with a "reason" field (e.g. "unable to apply", "beneficiary deceased") may be supplied; if omitted the default reason "returned by rail" is used. Requires payment:settle authority.

path Parameters
id
required
string <uuid>
Request Body schema: application/json
property name*
additional property
string

Responses

Request samples

Content type
application/json
{
  • "property1": "string",
  • "property2": "string"
}

Response samples

Content type
application/json
{
  • "amount": {
    },
  • "beneficiaryAccount": "string",
  • "beneficiaryName": "string",
  • "creditorAccountId": "0411bd28-c6c2-4498-8a47-b18d967449d7",
  • "debtorAccountId": "d9695c4c-f4a8-4c4e-b1b1-0b2201504693",
  • "failureReason": "string",
  • "narrative": "string",
  • "networkRef": "string",
  • "paymentId": "472e651e-5a1e-424d-8098-23858bf03ad7",
  • "rail": "string",
  • "reference": "string",
  • "screeningId": "c70fa460-d553-485e-9f44-b600a5be39b1",
  • "status": "string",
  • "type": "string"
}

Settle a payment

Explicitly settles a payment that was previously initiated but not yet settled (e.g. one that was approved via maker-checker). Triggers the accounting postings (debit sender, credit recipient) and transitions the payment to a settled state. Requires payment:settle authority.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "amount": {
    },
  • "beneficiaryAccount": "string",
  • "beneficiaryName": "string",
  • "creditorAccountId": "0411bd28-c6c2-4498-8a47-b18d967449d7",
  • "debtorAccountId": "d9695c4c-f4a8-4c4e-b1b1-0b2201504693",
  • "failureReason": "string",
  • "narrative": "string",
  • "networkRef": "string",
  • "paymentId": "472e651e-5a1e-424d-8098-23858bf03ad7",
  • "rail": "string",
  • "reference": "string",
  • "screeningId": "c70fa460-d553-485e-9f44-b600a5be39b1",
  • "status": "string",
  • "type": "string"
}

Products

Product factory and configuration (admin/operations). Products are the reusable templates from which accounts and loans are originated — they carry interest plans, fee schedules, GL mappings and CDD-tier-based limits. A product moves through a lifecycle: DRAFT → ACTIVE → SUSPENDED → RETIRED; only ACTIVE products may be used for origination. Reads require product:read; all mutations (create, configure, lifecycle transitions) require product:manage.

List all products

Returns a summary list of every product regardless of lifecycle state, ordered by creation date descending.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create a product

Creates a new product in DRAFT state. The caller supplies the product type, currency, and initial configuration. Returns the full product view (including the generated id) with HTTP 201. The product must be configured (interest plan, GL mapping, limits) and then activated before it can be used for origination. Requires product:manage.

Request Body schema: application/json
required
allowMultiCurrency
boolean
allowedCddTiers
Array of strings
allowedSegments
Array of strings
baseCurrency
string
collateralRequired
boolean
defaultOverdraftLimit
number
defaultTermMonths
integer <int32>
description
string
dormancyDays
integer <int32>
earlySettlementPenaltyRate
number
earlyWithdrawalPenaltyRate
number
interestBearing
boolean
maxBalance
number
maxLtvRatio
number
maxPrincipal
number
maxTermMonths
integer <int32>
minBalance
number
minOpeningBalance
number
minPrincipal
number
minTermMonths
integer <int32>
name
required
string non-empty
overdraftAllowed
boolean
processingFeeRate
number
productClass
required
string non-empty
productCode
required
string non-empty
provisionStage1Rate
number
provisionStage2Days
integer <int32>
provisionStage2Rate
number
provisionStage3Days
integer <int32>
provisionStage3Rate
number
repaymentFrequency
string
repaymentMethod
string
rolloverPolicy
string
statementFrequency
string

Responses

Request samples

Content type
application/json
{
  • "allowMultiCurrency": true,
  • "allowedCddTiers": [
    ],
  • "allowedSegments": [
    ],
  • "baseCurrency": "string",
  • "collateralRequired": true,
  • "defaultOverdraftLimit": 0,
  • "defaultTermMonths": 0,
  • "description": "string",
  • "dormancyDays": 0,
  • "earlySettlementPenaltyRate": 0,
  • "earlyWithdrawalPenaltyRate": 0,
  • "interestBearing": true,
  • "maxBalance": 0,
  • "maxLtvRatio": 0,
  • "maxPrincipal": 0,
  • "maxTermMonths": 0,
  • "minBalance": 0,
  • "minOpeningBalance": 0,
  • "minPrincipal": 0,
  • "minTermMonths": 0,
  • "name": "string",
  • "overdraftAllowed": true,
  • "processingFeeRate": 0,
  • "productClass": "string",
  • "productCode": "string",
  • "provisionStage1Rate": 0,
  • "provisionStage2Days": 0,
  • "provisionStage2Rate": 0,
  • "provisionStage3Days": 0,
  • "provisionStage3Rate": 0,
  • "repaymentFrequency": "string",
  • "repaymentMethod": "string",
  • "rolloverPolicy": "string",
  • "statementFrequency": "string"
}

Response samples

Content type
application/json
{
  • "allowMultiCurrency": true,
  • "allowedCddTiers": [
    ],
  • "allowedSegments": [
    ],
  • "baseCurrency": "string",
  • "collateralRequired": true,
  • "defaultOverdraftLimit": 0,
  • "defaultTermMonths": 0,
  • "description": "string",
  • "dormancyDays": 0,
  • "earlySettlementPenaltyRate": 0,
  • "earlyWithdrawalPenaltyRate": 0,
  • "fees": [
    ],
  • "glMappings": [
    ],
  • "interestBearing": true,
  • "interestPlan": {
    },
  • "limits": [
    ],
  • "loanInterestPlan": {
    },
  • "maxBalance": 0,
  • "maxLtvRatio": 0,
  • "maxPrincipal": 0,
  • "maxTermMonths": 0,
  • "minBalance": 0,
  • "minOpeningBalance": 0,
  • "minPrincipal": 0,
  • "minTermMonths": 0,
  • "name": "string",
  • "overdraftAllowed": true,
  • "processingFeeRate": 0,
  • "productClass": "string",
  • "productCode": "string",
  • "productId": "dcd53ddb-8104-4e48-8cc0-5df1088c6113",
  • "provisionStage1Rate": 0,
  • "provisionStage2Days": 0,
  • "provisionStage2Rate": 0,
  • "provisionStage3Days": 0,
  • "provisionStage3Rate": 0,
  • "repaymentFrequency": "string",
  • "repaymentMethod": "string",
  • "rolloverPolicy": "string",
  • "statementFrequency": "string",
  • "status": "string",
  • "version": 0
}

Get a product by id

Returns the full product view including interest plan, fee schedule, GL mappings and limit tiers, or 404 if the id is unknown.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "allowMultiCurrency": true,
  • "allowedCddTiers": [
    ],
  • "allowedSegments": [
    ],
  • "baseCurrency": "string",
  • "collateralRequired": true,
  • "defaultOverdraftLimit": 0,
  • "defaultTermMonths": 0,
  • "description": "string",
  • "dormancyDays": 0,
  • "earlySettlementPenaltyRate": 0,
  • "earlyWithdrawalPenaltyRate": 0,
  • "fees": [
    ],
  • "glMappings": [
    ],
  • "interestBearing": true,
  • "interestPlan": {
    },
  • "limits": [
    ],
  • "loanInterestPlan": {
    },
  • "maxBalance": 0,
  • "maxLtvRatio": 0,
  • "maxPrincipal": 0,
  • "maxTermMonths": 0,
  • "minBalance": 0,
  • "minOpeningBalance": 0,
  • "minPrincipal": 0,
  • "minTermMonths": 0,
  • "name": "string",
  • "overdraftAllowed": true,
  • "processingFeeRate": 0,
  • "productClass": "string",
  • "productCode": "string",
  • "productId": "dcd53ddb-8104-4e48-8cc0-5df1088c6113",
  • "provisionStage1Rate": 0,
  • "provisionStage2Days": 0,
  • "provisionStage2Rate": 0,
  • "provisionStage3Days": 0,
  • "provisionStage3Rate": 0,
  • "repaymentFrequency": "string",
  • "repaymentMethod": "string",
  • "rolloverPolicy": "string",
  • "statementFrequency": "string",
  • "status": "string",
  • "version": 0
}

Activate a product

Transitions the product from DRAFT or SUSPENDED to ACTIVE, making it available for account and loan origination. The product must have a complete configuration (GL mapping and at least one interest plan where applicable) before activation is permitted. Returns the updated product view. Requires product:manage.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "allowMultiCurrency": true,
  • "allowedCddTiers": [
    ],
  • "allowedSegments": [
    ],
  • "baseCurrency": "string",
  • "collateralRequired": true,
  • "defaultOverdraftLimit": 0,
  • "defaultTermMonths": 0,
  • "description": "string",
  • "dormancyDays": 0,
  • "earlySettlementPenaltyRate": 0,
  • "earlyWithdrawalPenaltyRate": 0,
  • "fees": [
    ],
  • "glMappings": [
    ],
  • "interestBearing": true,
  • "interestPlan": {
    },
  • "limits": [
    ],
  • "loanInterestPlan": {
    },
  • "maxBalance": 0,
  • "maxLtvRatio": 0,
  • "maxPrincipal": 0,
  • "maxTermMonths": 0,
  • "minBalance": 0,
  • "minOpeningBalance": 0,
  • "minPrincipal": 0,
  • "minTermMonths": 0,
  • "name": "string",
  • "overdraftAllowed": true,
  • "processingFeeRate": 0,
  • "productClass": "string",
  • "productCode": "string",
  • "productId": "dcd53ddb-8104-4e48-8cc0-5df1088c6113",
  • "provisionStage1Rate": 0,
  • "provisionStage2Days": 0,
  • "provisionStage2Rate": 0,
  • "provisionStage3Days": 0,
  • "provisionStage3Rate": 0,
  • "repaymentFrequency": "string",
  • "repaymentMethod": "string",
  • "rolloverPolicy": "string",
  • "statementFrequency": "string",
  • "status": "string",
  • "version": 0
}

Add a fee to a product

Appends a fee definition (type, name, amount/rate, trigger event) to the product's fee schedule. Fees are applied at origination or during servicing events (e.g. disbursement, late payment). Returns the updated product view with the full fee list. Requires product:manage.

path Parameters
id
required
string <uuid>
Request Body schema: application/json
required
amount
number
chargeEvent
string
feeCode
required
string non-empty
feeType
required
string non-empty
maxAmount
number
minAmount
number
name
required
string non-empty
rate
number
taxable
boolean
waivable
boolean

Responses

Request samples

Content type
application/json
{
  • "amount": 0,
  • "chargeEvent": "string",
  • "feeCode": "string",
  • "feeType": "string",
  • "maxAmount": 0,
  • "minAmount": 0,
  • "name": "string",
  • "rate": 0,
  • "taxable": true,
  • "waivable": true
}

Response samples

Content type
application/json
{
  • "allowMultiCurrency": true,
  • "allowedCddTiers": [
    ],
  • "allowedSegments": [
    ],
  • "baseCurrency": "string",
  • "collateralRequired": true,
  • "defaultOverdraftLimit": 0,
  • "defaultTermMonths": 0,
  • "description": "string",
  • "dormancyDays": 0,
  • "earlySettlementPenaltyRate": 0,
  • "earlyWithdrawalPenaltyRate": 0,
  • "fees": [
    ],
  • "glMappings": [
    ],
  • "interestBearing": true,
  • "interestPlan": {
    },
  • "limits": [
    ],
  • "loanInterestPlan": {
    },
  • "maxBalance": 0,
  • "maxLtvRatio": 0,
  • "maxPrincipal": 0,
  • "maxTermMonths": 0,
  • "minBalance": 0,
  • "minOpeningBalance": 0,
  • "minPrincipal": 0,
  • "minTermMonths": 0,
  • "name": "string",
  • "overdraftAllowed": true,
  • "processingFeeRate": 0,
  • "productClass": "string",
  • "productCode": "string",
  • "productId": "dcd53ddb-8104-4e48-8cc0-5df1088c6113",
  • "provisionStage1Rate": 0,
  • "provisionStage2Days": 0,
  • "provisionStage2Rate": 0,
  • "provisionStage3Days": 0,
  • "provisionStage3Rate": 0,
  • "repaymentFrequency": "string",
  • "repaymentMethod": "string",
  • "rolloverPolicy": "string",
  • "statementFrequency": "string",
  • "status": "string",
  • "version": 0
}

Remove a fee from a product

Deletes the fee identified by feeId from the product's fee schedule. The fee is removed immediately; accounts already originated retain their historical fee schedule. Returns the updated product view. Requires product:manage.

path Parameters
id
required
string <uuid>
feeId
required
string <uuid>

Id of the fee definition to remove

Responses

Response samples

Content type
application/json
{
  • "allowMultiCurrency": true,
  • "allowedCddTiers": [
    ],
  • "allowedSegments": [
    ],
  • "baseCurrency": "string",
  • "collateralRequired": true,
  • "defaultOverdraftLimit": 0,
  • "defaultTermMonths": 0,
  • "description": "string",
  • "dormancyDays": 0,
  • "earlySettlementPenaltyRate": 0,
  • "earlyWithdrawalPenaltyRate": 0,
  • "fees": [
    ],
  • "glMappings": [
    ],
  • "interestBearing": true,
  • "interestPlan": {
    },
  • "limits": [
    ],
  • "loanInterestPlan": {
    },
  • "maxBalance": 0,
  • "maxLtvRatio": 0,
  • "maxPrincipal": 0,
  • "maxTermMonths": 0,
  • "minBalance": 0,
  • "minOpeningBalance": 0,
  • "minPrincipal": 0,
  • "minTermMonths": 0,
  • "name": "string",
  • "overdraftAllowed": true,
  • "processingFeeRate": 0,
  • "productClass": "string",
  • "productCode": "string",
  • "productId": "dcd53ddb-8104-4e48-8cc0-5df1088c6113",
  • "provisionStage1Rate": 0,
  • "provisionStage2Days": 0,
  • "provisionStage2Rate": 0,
  • "provisionStage3Days": 0,
  • "provisionStage3Rate": 0,
  • "repaymentFrequency": "string",
  • "repaymentMethod": "string",
  • "rolloverPolicy": "string",
  • "statementFrequency": "string",
  • "status": "string",
  • "version": 0
}

Set GL mapping

Replaces the General Ledger account mapping for the product — principal GL, interest income GL, fee income GL, and penalty GL codes. The mapping is used by the posting engine when transactions are originated from this product. Returns the updated product view. Requires product:manage.

path Parameters
id
required
string <uuid>
Request Body schema: application/json
required
glAccountCode
required
string non-empty
purpose
required
string non-empty

Responses

Request samples

Content type
application/json
{
  • "glAccountCode": "string",
  • "purpose": "string"
}

Response samples

Content type
application/json
{
  • "allowMultiCurrency": true,
  • "allowedCddTiers": [
    ],
  • "allowedSegments": [
    ],
  • "baseCurrency": "string",
  • "collateralRequired": true,
  • "defaultOverdraftLimit": 0,
  • "defaultTermMonths": 0,
  • "description": "string",
  • "dormancyDays": 0,
  • "earlySettlementPenaltyRate": 0,
  • "earlyWithdrawalPenaltyRate": 0,
  • "fees": [
    ],
  • "glMappings": [
    ],
  • "interestBearing": true,
  • "interestPlan": {
    },
  • "limits": [
    ],
  • "loanInterestPlan": {
    },
  • "maxBalance": 0,
  • "maxLtvRatio": 0,
  • "maxPrincipal": 0,
  • "maxTermMonths": 0,
  • "minBalance": 0,
  • "minOpeningBalance": 0,
  • "minPrincipal": 0,
  • "minTermMonths": 0,
  • "name": "string",
  • "overdraftAllowed": true,
  • "processingFeeRate": 0,
  • "productClass": "string",
  • "productCode": "string",
  • "productId": "dcd53ddb-8104-4e48-8cc0-5df1088c6113",
  • "provisionStage1Rate": 0,
  • "provisionStage2Days": 0,
  • "provisionStage2Rate": 0,
  • "provisionStage3Days": 0,
  • "provisionStage3Rate": 0,
  • "repaymentFrequency": "string",
  • "repaymentMethod": "string",
  • "rolloverPolicy": "string",
  • "statementFrequency": "string",
  • "status": "string",
  • "version": 0
}

Set deposit/savings interest plan

Replaces the deposit or savings interest plan on the product (rate, compounding frequency, payment day). Applies to DEPOSIT and SAVINGS product types. The change takes effect for any new accounts originated after this call; existing accounts are not retroactively repriced. Returns the updated product view. Requires product:manage.

path Parameters
id
required
string <uuid>
Request Body schema: application/json
required
calcMethod
string
capitalizationFrequency
string
dayCountBasis
string
minBalanceToEarn
number
rate
required
number
tiered
boolean
Array of objects (Tier)

Responses

Request samples

Content type
application/json
{
  • "calcMethod": "string",
  • "capitalizationFrequency": "string",
  • "dayCountBasis": "string",
  • "minBalanceToEarn": 0,
  • "rate": 0,
  • "tiered": true,
  • "tiers": [
    ]
}

Response samples

Content type
application/json
{
  • "allowMultiCurrency": true,
  • "allowedCddTiers": [
    ],
  • "allowedSegments": [
    ],
  • "baseCurrency": "string",
  • "collateralRequired": true,
  • "defaultOverdraftLimit": 0,
  • "defaultTermMonths": 0,
  • "description": "string",
  • "dormancyDays": 0,
  • "earlySettlementPenaltyRate": 0,
  • "earlyWithdrawalPenaltyRate": 0,
  • "fees": [
    ],
  • "glMappings": [
    ],
  • "interestBearing": true,
  • "interestPlan": {
    },
  • "limits": [
    ],
  • "loanInterestPlan": {
    },
  • "maxBalance": 0,
  • "maxLtvRatio": 0,
  • "maxPrincipal": 0,
  • "maxTermMonths": 0,
  • "minBalance": 0,
  • "minOpeningBalance": 0,
  • "minPrincipal": 0,
  • "minTermMonths": 0,
  • "name": "string",
  • "overdraftAllowed": true,
  • "processingFeeRate": 0,
  • "productClass": "string",
  • "productCode": "string",
  • "productId": "dcd53ddb-8104-4e48-8cc0-5df1088c6113",
  • "provisionStage1Rate": 0,
  • "provisionStage2Days": 0,
  • "provisionStage2Rate": 0,
  • "provisionStage3Days": 0,
  • "provisionStage3Rate": 0,
  • "repaymentFrequency": "string",
  • "repaymentMethod": "string",
  • "rolloverPolicy": "string",
  • "statementFrequency": "string",
  • "status": "string",
  • "version": 0
}

Set a CDD-tier limit

Upserts a transaction or balance limit for a specific Customer Due Diligence (CDD) tier on the product. Each tier (e.g. BASIC, STANDARD, ENHANCED) may carry distinct minimum/maximum balance and single-transaction caps. If a limit for the tier already exists it is replaced. Returns the updated product view with all tier limits. Requires product:manage.

path Parameters
id
required
string <uuid>
Request Body schema: application/json
required
cddTier
required
string non-empty
crossBorderAllowed
boolean
maxBalance
number
maxDailyDebit
number
maxMonthlyThroughput
number
maxPerTransaction
number

Responses

Request samples

Content type
application/json
{
  • "cddTier": "string",
  • "crossBorderAllowed": true,
  • "maxBalance": 0,
  • "maxDailyDebit": 0,
  • "maxMonthlyThroughput": 0,
  • "maxPerTransaction": 0
}

Response samples

Content type
application/json
{
  • "allowMultiCurrency": true,
  • "allowedCddTiers": [
    ],
  • "allowedSegments": [
    ],
  • "baseCurrency": "string",
  • "collateralRequired": true,
  • "defaultOverdraftLimit": 0,
  • "defaultTermMonths": 0,
  • "description": "string",
  • "dormancyDays": 0,
  • "earlySettlementPenaltyRate": 0,
  • "earlyWithdrawalPenaltyRate": 0,
  • "fees": [
    ],
  • "glMappings": [
    ],
  • "interestBearing": true,
  • "interestPlan": {
    },
  • "limits": [
    ],
  • "loanInterestPlan": {
    },
  • "maxBalance": 0,
  • "maxLtvRatio": 0,
  • "maxPrincipal": 0,
  • "maxTermMonths": 0,
  • "minBalance": 0,
  • "minOpeningBalance": 0,
  • "minPrincipal": 0,
  • "minTermMonths": 0,
  • "name": "string",
  • "overdraftAllowed": true,
  • "processingFeeRate": 0,
  • "productClass": "string",
  • "productCode": "string",
  • "productId": "dcd53ddb-8104-4e48-8cc0-5df1088c6113",
  • "provisionStage1Rate": 0,
  • "provisionStage2Days": 0,
  • "provisionStage2Rate": 0,
  • "provisionStage3Days": 0,
  • "provisionStage3Rate": 0,
  • "repaymentFrequency": "string",
  • "repaymentMethod": "string",
  • "rolloverPolicy": "string",
  • "statementFrequency": "string",
  • "status": "string",
  • "version": 0
}

Remove a CDD-tier limit

Deletes the limit entry for the given CDD tier from the product. After removal, accounts in that tier fall back to the product's default (uncapped) behaviour. Returns the updated product view. Requires product:manage.

path Parameters
id
required
string <uuid>
cddTier
required
string

CDD tier name whose limit should be removed (e.g. BASIC, STANDARD, ENHANCED)

Responses

Response samples

Content type
application/json
{
  • "allowMultiCurrency": true,
  • "allowedCddTiers": [
    ],
  • "allowedSegments": [
    ],
  • "baseCurrency": "string",
  • "collateralRequired": true,
  • "defaultOverdraftLimit": 0,
  • "defaultTermMonths": 0,
  • "description": "string",
  • "dormancyDays": 0,
  • "earlySettlementPenaltyRate": 0,
  • "earlyWithdrawalPenaltyRate": 0,
  • "fees": [
    ],
  • "glMappings": [
    ],
  • "interestBearing": true,
  • "interestPlan": {
    },
  • "limits": [
    ],
  • "loanInterestPlan": {
    },
  • "maxBalance": 0,
  • "maxLtvRatio": 0,
  • "maxPrincipal": 0,
  • "maxTermMonths": 0,
  • "minBalance": 0,
  • "minOpeningBalance": 0,
  • "minPrincipal": 0,
  • "minTermMonths": 0,
  • "name": "string",
  • "overdraftAllowed": true,
  • "processingFeeRate": 0,
  • "productClass": "string",
  • "productCode": "string",
  • "productId": "dcd53ddb-8104-4e48-8cc0-5df1088c6113",
  • "provisionStage1Rate": 0,
  • "provisionStage2Days": 0,
  • "provisionStage2Rate": 0,
  • "provisionStage3Days": 0,
  • "provisionStage3Rate": 0,
  • "repaymentFrequency": "string",
  • "repaymentMethod": "string",
  • "rolloverPolicy": "string",
  • "statementFrequency": "string",
  • "status": "string",
  • "version": 0
}

Set loan interest plan

Replaces the loan interest plan on the product (nominal rate, effective rate, compounding method, penalty rate, and grace period). Applies to LOAN product types. The plan governs amortisation schedules generated for loans originated from this product after the update. Returns the updated product view. Requires product:manage.

path Parameters
id
required
string <uuid>
Request Body schema: application/json
required
dayCountBasis
string
gracePeriodMonths
integer <int32>
interestMethod
required
string
maxRate
number
minRate
number
penaltyRate
number
rate
required
number
rateType
string

Responses

Request samples

Content type
application/json
{
  • "dayCountBasis": "string",
  • "gracePeriodMonths": 0,
  • "interestMethod": "string",
  • "maxRate": 0,
  • "minRate": 0,
  • "penaltyRate": 0,
  • "rate": 0,
  • "rateType": "string"
}

Response samples

Content type
application/json
{
  • "allowMultiCurrency": true,
  • "allowedCddTiers": [
    ],
  • "allowedSegments": [
    ],
  • "baseCurrency": "string",
  • "collateralRequired": true,
  • "defaultOverdraftLimit": 0,
  • "defaultTermMonths": 0,
  • "description": "string",
  • "dormancyDays": 0,
  • "earlySettlementPenaltyRate": 0,
  • "earlyWithdrawalPenaltyRate": 0,
  • "fees": [
    ],
  • "glMappings": [
    ],
  • "interestBearing": true,
  • "interestPlan": {
    },
  • "limits": [
    ],
  • "loanInterestPlan": {
    },
  • "maxBalance": 0,
  • "maxLtvRatio": 0,
  • "maxPrincipal": 0,
  • "maxTermMonths": 0,
  • "minBalance": 0,
  • "minOpeningBalance": 0,
  • "minPrincipal": 0,
  • "minTermMonths": 0,
  • "name": "string",
  • "overdraftAllowed": true,
  • "processingFeeRate": 0,
  • "productClass": "string",
  • "productCode": "string",
  • "productId": "dcd53ddb-8104-4e48-8cc0-5df1088c6113",
  • "provisionStage1Rate": 0,
  • "provisionStage2Days": 0,
  • "provisionStage2Rate": 0,
  • "provisionStage3Days": 0,
  • "provisionStage3Rate": 0,
  • "repaymentFrequency": "string",
  • "repaymentMethod": "string",
  • "rolloverPolicy": "string",
  • "statementFrequency": "string",
  • "status": "string",
  • "version": 0
}

Retire a product

Permanently retires the product (terminal state). A RETIRED product cannot be reactivated or used for new originations. Existing accounts and loans on this product are unaffected. Returns the updated product view. Requires product:manage.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "allowMultiCurrency": true,
  • "allowedCddTiers": [
    ],
  • "allowedSegments": [
    ],
  • "baseCurrency": "string",
  • "collateralRequired": true,
  • "defaultOverdraftLimit": 0,
  • "defaultTermMonths": 0,
  • "description": "string",
  • "dormancyDays": 0,
  • "earlySettlementPenaltyRate": 0,
  • "earlyWithdrawalPenaltyRate": 0,
  • "fees": [
    ],
  • "glMappings": [
    ],
  • "interestBearing": true,
  • "interestPlan": {
    },
  • "limits": [
    ],
  • "loanInterestPlan": {
    },
  • "maxBalance": 0,
  • "maxLtvRatio": 0,
  • "maxPrincipal": 0,
  • "maxTermMonths": 0,
  • "minBalance": 0,
  • "minOpeningBalance": 0,
  • "minPrincipal": 0,
  • "minTermMonths": 0,
  • "name": "string",
  • "overdraftAllowed": true,
  • "processingFeeRate": 0,
  • "productClass": "string",
  • "productCode": "string",
  • "productId": "dcd53ddb-8104-4e48-8cc0-5df1088c6113",
  • "provisionStage1Rate": 0,
  • "provisionStage2Days": 0,
  • "provisionStage2Rate": 0,
  • "provisionStage3Days": 0,
  • "provisionStage3Rate": 0,
  • "repaymentFrequency": "string",
  • "repaymentMethod": "string",
  • "rolloverPolicy": "string",
  • "statementFrequency": "string",
  • "status": "string",
  • "version": 0
}

Suspend a product

Moves an ACTIVE product to SUSPENDED, preventing new originations. Existing accounts and loans already on this product continue to operate normally. The product can be reactivated. Returns the updated product view. Requires product:manage.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "allowMultiCurrency": true,
  • "allowedCddTiers": [
    ],
  • "allowedSegments": [
    ],
  • "baseCurrency": "string",
  • "collateralRequired": true,
  • "defaultOverdraftLimit": 0,
  • "defaultTermMonths": 0,
  • "description": "string",
  • "dormancyDays": 0,
  • "earlySettlementPenaltyRate": 0,
  • "earlyWithdrawalPenaltyRate": 0,
  • "fees": [
    ],
  • "glMappings": [
    ],
  • "interestBearing": true,
  • "interestPlan": {
    },
  • "limits": [
    ],
  • "loanInterestPlan": {
    },
  • "maxBalance": 0,
  • "maxLtvRatio": 0,
  • "maxPrincipal": 0,
  • "maxTermMonths": 0,
  • "minBalance": 0,
  • "minOpeningBalance": 0,
  • "minPrincipal": 0,
  • "minTermMonths": 0,
  • "name": "string",
  • "overdraftAllowed": true,
  • "processingFeeRate": 0,
  • "productClass": "string",
  • "productCode": "string",
  • "productId": "dcd53ddb-8104-4e48-8cc0-5df1088c6113",
  • "provisionStage1Rate": 0,
  • "provisionStage2Days": 0,
  • "provisionStage2Rate": 0,
  • "provisionStage3Days": 0,
  • "provisionStage3Rate": 0,
  • "repaymentFrequency": "string",
  • "repaymentMethod": "string",
  • "rolloverPolicy": "string",
  • "statementFrequency": "string",
  • "status": "string",
  • "version": 0
}

Collateral

Collateral registry — register, query, pledge, and release security assets tied to loans. Collateral items (property, vehicles, guarantees, etc.) are tracked as independent registry entries and associated with loan accounts via pledge/release lifecycle transitions. Read operations require collateral:read; state-mutating operations (register, pledge, release) require collateral:manage.

List all collateral items

Returns every collateral item in the registry regardless of status or pledge state.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Register a collateral item

Creates a new collateral item in the registry (e.g. title deed, vehicle, guarantee). The item is registered in a free/unpledged state and can subsequently be pledged to a loan. Returns the persisted collateral view with its generated id. Requires collateral:manage.

Request Body schema: application/json
required
description
string
haircutBps
integer <int32>
required
object (MonetaryAmount)

A monetary amount as serialised by Jackson (JSR-354).

ownerPartyId
required
string <uuid>
type
required
string non-empty

Responses

Request samples

Content type
application/json
{
  • "description": "string",
  • "haircutBps": 0,
  • "marketValue": {
    },
  • "ownerPartyId": "ed1b7cc4-458a-42b5-8fbd-7f0f4a9eba71",
  • "type": "string"
}

Response samples

Content type
application/json
{
  • "description": "string",
  • "haircutBps": 0,
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "marketValue": {
    },
  • "ownerPartyId": "ed1b7cc4-458a-42b5-8fbd-7f0f4a9eba71",
  • "pledgedToLoanId": "ea71daea-445f-4753-be17-e314de546ebd",
  • "realizableValue": {
    },
  • "reference": "string",
  • "status": "string",
  • "type": "string"
}

List collateral pledged against a loan

Returns all collateral items currently or previously associated with the given loan account. Useful for credit officers reviewing security coverage on a specific loan.

path Parameters
loanId
required
string <uuid>

Loan account id whose pledged collateral items are to be listed

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Get a collateral item by id

Returns the collateral item with the given id, or 404 if no such item exists in the registry.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "description": "string",
  • "haircutBps": 0,
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "marketValue": {
    },
  • "ownerPartyId": "ed1b7cc4-458a-42b5-8fbd-7f0f4a9eba71",
  • "pledgedToLoanId": "ea71daea-445f-4753-be17-e314de546ebd",
  • "realizableValue": {
    },
  • "reference": "string",
  • "status": "string",
  • "type": "string"
}

Pledge collateral to a loan

Associates a free collateral item with the specified loan, transitioning it to a PLEDGED state. A pledged item cannot be pledged to another loan until released. Requires collateral:manage.

path Parameters
id
required
string <uuid>
query Parameters
loanId
required
string <uuid>

Loan account id to which this collateral item is being pledged

Responses

Response samples

Content type
application/json
{
  • "description": "string",
  • "haircutBps": 0,
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "marketValue": {
    },
  • "ownerPartyId": "ed1b7cc4-458a-42b5-8fbd-7f0f4a9eba71",
  • "pledgedToLoanId": "ea71daea-445f-4753-be17-e314de546ebd",
  • "realizableValue": {
    },
  • "reference": "string",
  • "status": "string",
  • "type": "string"
}

Release collateral from a loan

Removes the pledge association between this collateral item and its current loan, transitioning the item back to a free/unpledged state. Typically called at loan closure or early settlement. Requires collateral:manage.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "description": "string",
  • "haircutBps": 0,
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "marketValue": {
    },
  • "ownerPartyId": "ed1b7cc4-458a-42b5-8fbd-7f0f4a9eba71",
  • "pledgedToLoanId": "ea71daea-445f-4753-be17-e314de546ebd",
  • "realizableValue": {
    },
  • "reference": "string",
  • "status": "string",
  • "type": "string"
}

Approvals

Maker-checker queue for dual-control operations. Any context that requires a second signatory parks its mutation as an ApprovalRequest here; a checker then approves (which executes the parked operation) or rejects it. Reads require approval:view (class-level); deciding requires approval:decide plus an amount-tier authority enforced by the service. A maker cannot be their own checker — the checker identity is always derived from the authenticated principal.

List all approval requests

Returns every approval request regardless of status (PENDING, APPROVED, REJECTED). Useful for audit trails and full queue inspection.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

List pending approval requests

Returns only the approval requests that are still awaiting a checker decision. This is the primary view for the checker workflow — makers poll this to see their own parked operations, checkers poll it to see what requires their decision.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Get a single approval request

Returns the full detail of one approval request by its id, including the parked operation payload, maker identity, timestamps, and current status. Returns 404 if not found.

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "amount": {
    },
  • "approvers": [
    ],
  • "checker": "string",
  • "decidedAt": "string",
  • "decisionNote": "string",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "maker": "string",
  • "operation": "string",
  • "requestedAt": "string",
  • "requiredApprovals": 0,
  • "status": "string",
  • "targetRef": "string"
}

Approve a pending request

Checker approves the parked request: the service validates that the authenticated principal is not the original maker, then checks that the principal holds a sufficient amount-tier authority for the operation's value. On success the parked operation is executed (its side effects — postings, state transitions, etc. — happen synchronously) and the approval record moves to APPROVED. An optional note can be attached. Non-idempotent: calling twice on an already-decided request will fail.

path Parameters
id
required
string <uuid>
Request Body schema: application/json
note
string

Responses

Request samples

Content type
application/json
{
  • "note": "string"
}

Response samples

Content type
application/json
{
  • "amount": {
    },
  • "approvers": [
    ],
  • "checker": "string",
  • "decidedAt": "string",
  • "decisionNote": "string",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "maker": "string",
  • "operation": "string",
  • "requestedAt": "string",
  • "requiredApprovals": 0,
  • "status": "string",
  • "targetRef": "string"
}

Reject a pending request

Checker rejects the parked request. The parked operation is discarded without executing; the approval record moves to REJECTED and the maker is notified via domain events. An optional note capturing the rejection reason can be supplied. Non-idempotent: calling twice on an already-decided request will fail.

path Parameters
id
required
string <uuid>
Request Body schema: application/json
note
string

Responses

Request samples

Content type
application/json
{
  • "note": "string"
}

Response samples

Content type
application/json
{
  • "amount": {
    },
  • "approvers": [
    ],
  • "checker": "string",
  • "decidedAt": "string",
  • "decisionNote": "string",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "maker": "string",
  • "operation": "string",
  • "requestedAt": "string",
  • "requiredApprovals": 0,
  • "status": "string",
  • "targetRef": "string"
}

Prepaid

Prepaid / stored-value (e-money) account management. Each account holds a balance ring-fenced in a safeguarding pool; funds can be loaded externally (cash agent, bank transfer) or by internal cash-out from a linked deposit account. Tier levels govern maximum balance and daily spend limits under e-money regulations. Reads require prepaid:read; all mutations require prepaid:operate.

List all prepaid accounts

Returns every prepaid account with its current balance, tier, status, and holder reference.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Open a prepaid account

Creates a new prepaid stored-value account for a party. The account opens at the base tier with a zero balance. The safeguarding pool entry is created atomically. Returns the newly opened account view with status ACTIVE.

Request Body schema: application/json
required
currency
required
string
object (MonetaryAmount)

A monetary amount as serialised by Jackson (JSR-354).

expiresAt
string
holderPartyId
string <uuid>
kycTier
string
object (MonetaryAmount)

A monetary amount as serialised by Jackson (JSR-354).

object (MonetaryAmount)

A monetary amount as serialised by Jackson (JSR-354).

programType
string
reloadable
boolean

Responses

Request samples

Content type
application/json
{
  • "currency": "string",
  • "dailyLoadCap": {
    },
  • "expiresAt": "string",
  • "holderPartyId": "88171752-e02f-44db-8743-fff3061b2a46",
  • "kycTier": "string",
  • "loadCap": {
    },
  • "maxBalance": {
    },
  • "programType": "string",
  • "reloadable": true
}

Response samples

Content type
application/json
{
  • "available": {
    },
  • "balance": {
    },
  • "currency": "string",
  • "expiresAt": "string",
  • "holderPartyId": "88171752-e02f-44db-8743-fff3061b2a46",
  • "holds": {
    },
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "kycTier": "string",
  • "maxBalance": {
    },
  • "programType": "string",
  • "reference": "string",
  • "reloadable": true,
  • "status": "string"
}

Get safeguarding position

Returns the aggregate safeguarding position — total float held across all active prepaid accounts versus the amount currently lodged in the designated safeguarding credit institution. Used for regulatory e-money reporting and daily reconciliation.

Responses

Response samples

Content type
application/json
{
  • "lines": [
    ]
}

Get a prepaid account by id

Returns one prepaid account, or 404 if no account has that id.

path Parameters
id
required
string <uuid>

Prepaid account id

Responses

Response samples

Content type
application/json
{
  • "available": {
    },
  • "balance": {
    },
  • "currency": "string",
  • "expiresAt": "string",
  • "holderPartyId": "88171752-e02f-44db-8743-fff3061b2a46",
  • "holds": {
    },
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "kycTier": "string",
  • "maxBalance": {
    },
  • "programType": "string",
  • "reference": "string",
  • "reloadable": true,
  • "status": "string"
}

Cash out prepaid balance to a deposit account

Transfers an amount from the prepaid stored-value balance to the customer's linked deposit account. Debits the prepaid balance, credits the deposit account, and releases the corresponding safeguarding float. The request body must supply toDepositAccountId (UUID string) and amount (object with amount and currency fields).

path Parameters
id
required
string <uuid>

Prepaid account id

Request Body schema: application/json
required
property name*
additional property
any

Responses

Request samples

Content type
application/json
{
  • "property1": null,
  • "property2": null
}

Response samples

Content type
application/json
{
  • "available": {
    },
  • "balance": {
    },
  • "currency": "string",
  • "expiresAt": "string",
  • "holderPartyId": "88171752-e02f-44db-8743-fff3061b2a46",
  • "holds": {
    },
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "kycTier": "string",
  • "maxBalance": {
    },
  • "programType": "string",
  • "reference": "string",
  • "reloadable": true,
  • "status": "string"
}

Close a prepaid account

Permanently closes the account (terminal state). Any remaining balance must be zero or have been cashed out beforehand; the safeguarding entry is released. A closed account cannot be reopened.

path Parameters
id
required
string <uuid>

Prepaid account id

Responses

Response samples

Content type
application/json
{
  • "available": {
    },
  • "balance": {
    },
  • "currency": "string",
  • "expiresAt": "string",
  • "holderPartyId": "88171752-e02f-44db-8743-fff3061b2a46",
  • "holds": {
    },
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "kycTier": "string",
  • "maxBalance": {
    },
  • "programType": "string",
  • "reference": "string",
  • "reloadable": true,
  • "status": "string"
}

Apply a fee to a prepaid account

Debits a fee amount from the prepaid balance and credits it to the institution's fee income account. The request body must contain a "fee" key with a MonetaryAmount value. The account must be ACTIVE and have sufficient balance to cover the fee.

path Parameters
id
required
string <uuid>

Prepaid account id

Request Body schema: application/json
required
additional property
object (MonetaryAmount)

A monetary amount as serialised by Jackson (JSR-354).

Responses

Request samples

Content type
application/json
{
  • "property1": {
    },
  • "property2": {
    }
}

Response samples

Content type
application/json
{
  • "available": {
    },
  • "balance": {
    },
  • "currency": "string",
  • "expiresAt": "string",
  • "holderPartyId": "88171752-e02f-44db-8743-fff3061b2a46",
  • "holds": {
    },
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "kycTier": "string",
  • "maxBalance": {
    },
  • "programType": "string",
  • "reference": "string",
  • "reloadable": true,
  • "status": "string"
}

Freeze a prepaid account

Suspends an ACTIVE account — no loads or spend are permitted while frozen. Used for AML holds or customer-initiated blocks.

path Parameters
id
required
string <uuid>

Prepaid account id

Responses

Response samples

Content type
application/json
{
  • "available": {
    },
  • "balance": {
    },
  • "currency": "string",
  • "expiresAt": "string",
  • "holderPartyId": "88171752-e02f-44db-8743-fff3061b2a46",
  • "holds": {
    },
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "kycTier": "string",
  • "maxBalance": {
    },
  • "programType": "string",
  • "reference": "string",
  • "reloadable": true,
  • "status": "string"
}

Load funds onto a prepaid account

Credits the prepaid balance with an external load (e.g. cash agent deposit or incoming bank transfer). Posts a corresponding debit to the safeguarding float. The account must be ACTIVE and the resulting balance must not exceed the tier's maximum-balance cap.

path Parameters
id
required
string <uuid>

Prepaid account id

Request Body schema: application/json
required
required
object (MonetaryAmount)

A monetary amount as serialised by Jackson (JSR-354).

source
string

Responses

Request samples

Content type
application/json
{
  • "amount": {
    },
  • "source": "string"
}

Response samples

Content type
application/json
{
  • "available": {
    },
  • "balance": {
    },
  • "currency": "string",
  • "expiresAt": "string",
  • "holderPartyId": "88171752-e02f-44db-8743-fff3061b2a46",
  • "holds": {
    },
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "kycTier": "string",
  • "maxBalance": {
    },
  • "programType": "string",
  • "reference": "string",
  • "reloadable": true,
  • "status": "string"
}

List loads for an account

Returns the chronological load history (credits posted to the stored-value balance) for the specified account.

path Parameters
id
required
string <uuid>

Prepaid account id

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Unfreeze a prepaid account

Restores a FROZEN account to ACTIVE, re-enabling loads and spend.

path Parameters
id
required
string <uuid>

Prepaid account id

Responses

Response samples

Content type
application/json
{
  • "available": {
    },
  • "balance": {
    },
  • "currency": "string",
  • "expiresAt": "string",
  • "holderPartyId": "88171752-e02f-44db-8743-fff3061b2a46",
  • "holds": {
    },
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "kycTier": "string",
  • "maxBalance": {
    },
  • "programType": "string",
  • "reference": "string",
  • "reloadable": true,
  • "status": "string"
}

Upgrade account tier

Upgrades the account to the specified tier (e.g. BASIC → ENHANCED → FULL). Higher tiers allow a greater maximum stored balance and higher daily spend limits, subject to the customer having provided the required KYC documentary evidence. The request body must supply a "tier" string key.

path Parameters
id
required
string <uuid>

Prepaid account id

Request Body schema: application/json
required
property name*
additional property
string

Responses

Request samples

Content type
application/json
{
  • "property1": "string",
  • "property2": "string"
}

Response samples

Content type
application/json
{
  • "available": {
    },
  • "balance": {
    },
  • "currency": "string",
  • "expiresAt": "string",
  • "holderPartyId": "88171752-e02f-44db-8743-fff3061b2a46",
  • "holds": {
    },
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "kycTier": "string",
  • "maxBalance": {
    },
  • "programType": "string",
  • "reference": "string",
  • "reloadable": true,
  • "status": "string"
}

Commission Eligibility

Commission eligibility rules define which transactions attract a commission and at what rate or fixed amount. Each rule matches on commissionCode + productId + transactionCode and can further narrow scope by channel, currency, and amount band (amountFrom/amountTo). When multiple rules match, the lowest priority value wins. Rules may carry an overrideRate or overrideAmount to supersede the base schedule. Reads are open; mutations (create / update / delete) require the pricing:manage authority.

List commission eligibility rules

Returns all configured eligibility rules with their matching criteria (product, transaction code, channel, currency, amount band), priority, override rate/amount, and active flag.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create a commission eligibility rule

Creates a new eligibility rule that links a commissionCode to a product and transaction code, optionally narrowed by channel, currency, and amount band. Priority controls tie-breaking when several rules match the same transaction (lower value = higher precedence). An overrideRate or overrideAmount, when present, replaces the base commission schedule for matched transactions. Returns the generated rule id. Requires pricing:manage.

Request Body schema: application/json
required
amountFrom
number
amountTo
number
channel
string
commissionCode
required
string non-empty
currency
string
overrideAmount
number
overrideRate
number
priority
integer <int32>
productId
string <uuid>
transactionCode
required
string non-empty

Responses

Request samples

Content type
application/json
{
  • "amountFrom": 0,
  • "amountTo": 0,
  • "channel": "string",
  • "commissionCode": "string",
  • "currency": "string",
  • "overrideAmount": 0,
  • "overrideRate": 0,
  • "priority": 0,
  • "productId": "dcd53ddb-8104-4e48-8cc0-5df1088c6113",
  • "transactionCode": "string"
}

Response samples

Content type
application/json
{
  • "property1": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "property2": "497f6eca-6276-4993-bfeb-53cbbbba6f08"
}

Delete a commission eligibility rule

Permanently removes the eligibility rule with the given id. Once deleted the rule no longer participates in commission matching. Returns 204 No Content. Requires pricing:manage.

path Parameters
id
required
string <uuid>

Id of the eligibility rule to delete

Responses

Response samples

Content type
application/json
{
  • "error": "string",
  • "fieldErrors": {
    },
  • "message": "string"
}

Replace a commission eligibility rule

Fully replaces the eligibility rule identified by id with the supplied command payload. All fields (commissionCode, transactionCode, channel, currency, amount band, priority, overrideRate, overrideAmount) are overwritten. Returns 204 No Content on success. Requires pricing:manage.

path Parameters
id
required
string <uuid>

Id of the eligibility rule to replace

Request Body schema: application/json
required
amountFrom
number
amountTo
number
channel
string
commissionCode
required
string non-empty
currency
string
overrideAmount
number
overrideRate
number
priority
integer <int32>
productId
string <uuid>
transactionCode
required
string non-empty

Responses

Request samples

Content type
application/json
{
  • "amountFrom": 0,
  • "amountTo": 0,
  • "channel": "string",
  • "commissionCode": "string",
  • "currency": "string",
  • "overrideAmount": 0,
  • "overrideRate": 0,
  • "priority": 0,
  • "productId": "dcd53ddb-8104-4e48-8cc0-5df1088c6113",
  • "transactionCode": "string"
}

Response samples

Content type
application/json
{
  • "error": "string",
  • "fieldErrors": {
    },
  • "message": "string"
}

Permissions

Permission catalog management. Permissions are fine-grained authority strings (e.g. card:read, admin:users) that are assigned to roles and ultimately granted to users. The catalog acts as the authoritative registry of every permission that exists in the system. Reads are open to any authenticated staff member; creating new permissions requires the admin:users authority.

List all permissions

Returns the full permission catalog — every authority string registered in the system, including its name and description.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create a permission

Registers a new permission string in the catalog. The permission is immediately available for assignment to roles. No side effects on existing role or user grants — callers must explicitly assign the new permission to roles after creation. Returns HTTP 201 with the updated full permission list. Requires the admin:users authority.

Request Body schema: application/json
required
code
required
string non-empty
description
string

Responses

Request samples

Content type
application/json
{
  • "code": "string",
  • "description": "string"
}

Response samples

Content type
application/json
[
  • {
    }
]