Quickstart
Create a customer account, post a double-entry journal, and execute an internal transfer — all in under 5 minutes.
Prerequisites
- A Kora CBA tenant (e.g.
demo_bank) - A valid JWT token with at least
officerrole - Base URL:
https://api.korastratum.com/api/v1/cba
Step 1: Create an Account
- cURL
- Node.js
- Python
- Go
curl -X POST https://api.korastratum.com/api/v1/cba/accounts \
-H "Authorization: Bearer $TOKEN" \
-H "X-Tenant-ID: demo_bank" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: acct-$(uuidgen)" \
-d '{
"customer_id": "cust-uuid",
"account_type": "SAVINGS",
"currency": "NGN",
"product_code": "SAV001",
"branch_code": "001",
"alias": "My Savings",
"initial_deposit": 50000.00,
"created_by": "user-uuid"
}'
const res = await fetch("https://api.korastratum.com/api/v1/cba/accounts", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"X-Tenant-ID": "demo_bank",
"Content-Type": "application/json",
"Idempotency-Key": crypto.randomUUID(),
},
body: JSON.stringify({
customer_id: "cust-uuid",
account_type: "SAVINGS",
currency: "NGN",
product_code: "SAV001",
branch_code: "001",
alias: "My Savings",
initial_deposit: 50000.0,
created_by: "user-uuid",
}),
});
const account = await res.json();
console.log(account.account_number); // "1001234567"
import uuid
import requests
res = requests.post(
"https://api.korastratum.com/api/v1/cba/accounts",
headers={
"Authorization": f"Bearer {token}",
"X-Tenant-ID": "demo_bank",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"customer_id": "cust-uuid",
"account_type": "SAVINGS",
"currency": "NGN",
"product_code": "SAV001",
"branch_code": "001",
"alias": "My Savings",
"initial_deposit": 50000.00,
"created_by": "user-uuid",
},
)
account = res.json()
body := `{
"customer_id": "cust-uuid",
"account_type": "SAVINGS",
"currency": "NGN",
"product_code": "SAV001",
"branch_code": "001",
"alias": "My Savings",
"initial_deposit": 50000.00,
"created_by": "user-uuid"
}`
req, _ := http.NewRequest("POST",
"https://api.korastratum.com/api/v1/cba/accounts",
strings.NewReader(body))
req.Header.Set("Authorization", "Bearer "+token)
req.Header.Set("X-Tenant-ID", "demo_bank")
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Idempotency-Key", uuid.NewString())
resp, _ := http.DefaultClient.Do(req)
Response:
{
"id": "acct-uuid",
"account_number": "1001234567",
"account_type": "SAVINGS",
"status": "ACTIVE",
"currency": "NGN",
"available_balance": 50000.00,
"ledger_balance": 50000.00,
"created_at": "2026-02-28T10:00:00Z"
}
Step 2: Post a Journal Entry
Create a balanced double-entry journal to record a fee:
- cURL
- Node.js
curl -X POST https://api.korastratum.com/api/v1/cba/journals \
-H "Authorization: Bearer $TOKEN" \
-H "X-Tenant-ID: demo_bank" \
-H "Content-Type: application/json" \
-H "X-Idempotency-Key: jnl-$(uuidgen)" \
-d '{
"journal_type": "REVENUE",
"description": "Monthly account fee",
"fiscal_period_id": "period-uuid",
"transaction_date": "2026-02-28",
"effective_date": "2026-02-28",
"source_system": "ACCOUNT_SERVICE",
"source_reference": "FEE20260228001",
"entries": [
{
"account_id": "fee-receivable-uuid",
"amount": 500.00,
"entry_type": "debit",
"currency_code": "NGN",
"description": "Fee collected"
},
{
"account_id": "fee-income-uuid",
"amount": 500.00,
"entry_type": "credit",
"currency_code": "NGN",
"description": "Fee income"
}
]
}'
const res = await fetch("https://api.korastratum.com/api/v1/cba/journals", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"X-Tenant-ID": "demo_bank",
"Content-Type": "application/json",
"X-Idempotency-Key": crypto.randomUUID(),
},
body: JSON.stringify({
journal_type: "REVENUE",
description: "Monthly account fee",
fiscal_period_id: "period-uuid",
transaction_date: "2026-02-28",
effective_date: "2026-02-28",
source_system: "ACCOUNT_SERVICE",
source_reference: "FEE20260228001",
entries: [
{ account_id: "fee-receivable-uuid", amount: 500, entry_type: "debit", currency_code: "NGN", description: "Fee collected" },
{ account_id: "fee-income-uuid", amount: 500, entry_type: "credit", currency_code: "NGN", description: "Fee income" },
],
}),
});
const journal = await res.json();
console.log(journal.journal_number); // "JNL2602281"
The journal is created with status PENDING. Approve and post it:
# Approve
curl -X POST https://api.korastratum.com/api/v1/cba/journals/$JOURNAL_ID/approve \
-H "Authorization: Bearer $TOKEN" \
-H "X-Tenant-ID: demo_bank"
# Post
curl -X POST https://api.korastratum.com/api/v1/cba/journals/$JOURNAL_ID/post \
-H "Authorization: Bearer $TOKEN" \
-H "X-Tenant-ID: demo_bank"
Step 3: Make an Internal Transfer
- cURL
- Node.js
curl -X POST https://api.korastratum.com/api/v1/cba/transfers/internal \
-H "Authorization: Bearer $TOKEN" \
-H "X-Tenant-ID: demo_bank" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: txn-$(uuidgen)" \
-d '{
"source_account_id": "acct-uuid-1",
"destination_account_id": "acct-uuid-2",
"destination_account_name": "John Doe",
"amount": 25000.00,
"currency": "NGN",
"channel": "API",
"narration": "Test transfer",
"initiated_by": "user-uuid"
}'
const res = await fetch(
"https://api.korastratum.com/api/v1/cba/transfers/internal",
{
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"X-Tenant-ID": "demo_bank",
"Content-Type": "application/json",
"Idempotency-Key": crypto.randomUUID(),
},
body: JSON.stringify({
source_account_id: "acct-uuid-1",
destination_account_id: "acct-uuid-2",
destination_account_name: "John Doe",
amount: 25000.0,
currency: "NGN",
channel: "API",
narration: "Test transfer",
initiated_by: "user-uuid",
}),
}
);
const txn = await res.json();
console.log(txn.transaction_ref); // "TRN20260228001234"
Response:
{
"id": "txn-uuid",
"transaction_ref": "TRN20260228001234",
"transaction_type": "TRANSFER",
"status": "COMPLETED",
"amount": 25000.00,
"fee": 0.00,
"total_amount": 25000.00,
"transfer_type": "INTERNAL",
"channel": "API",
"completed_at": "2026-02-28T10:05:00Z"
}
What's Next
- General Ledger — Chart of accounts, journal lifecycle, and standing instructions.
- Accounts — Account types, virtual accounts, holds, and limits.
- Transactions — Interbank transfers, cross-currency, deposits, and withdrawals.
- Sandbox Testing — Test environment and simulated data.