Skip to content

Quickstart tutorial

This walks the spine of the platform from the API: get a token, open a customer, open an account, move money, and read the resulting journal entry. It mirrors the first flow an operator walks in the console.

Payloads are illustrative

The request bodies below show the shape of each call. The exact fields for every operation are in the API reference. Treat it as the source of truth and adjust field names to match your version.

0. Set up

export BASE=https://api.cortexbanking.com/api/v1
export AUTH=https://auth.cortexbanking.com

Your service client needs the permissions for each step below: at least customer:write, account:open and transfer:outbound (or the equivalent for the flow you run). See Authentication.

1. Get a token

TOKEN=$(curl -su "$CLIENT_ID:$CLIENT_SECRET" \
  -d grant_type=client_credentials \
  "$AUTH/oauth2/token" | jq -r .access_token)

Every call from here sends Authorization: Bearer $TOKEN.

2. Open a customer

curl -sX POST "$BASE/parties" \
  -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
  -d '{
    "type": "PERSON",
    "givenName": "Ada", "familyName": "Lovelace",
    "cddTier": "STANDARD"
  }'
# → { "partyId": "...", "customerNo": "C0001234", ... }

Capture the customerNo (or partyId). You will refer to the customer by it.

3. Open a deposit account

curl -sX POST "$BASE/accounts" \
  -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
  -d '{
    "customerNo": "C0001234",
    "productCode": "SAV-STD",
    "currency": "USD",
    "branchCode": "0001"
  }'
# → { "accountNo": "1000200030", "status": "ACTIVE", ... }

4. Move money, idempotently

Send an idempotencyKey on the write, and money as a {amount, currency} object (see Conventions and Idempotency):

curl -sX POST "$BASE/transfers" \
  -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
  -d '{
    "idempotencyKey": "quickstart-transfer-1",
    "fromAccount": "1000200030",
    "toAccount": "1000200048",
    "amount": { "amount": 250.00, "currency": "USD" }
  }'

Two outcomes are both normal:

  • 200/201: the transfer executed. You get the transfer and its ledger legs.
  • 202 + approvalId: the amount was over the auto-limit, so it is parked for a checker. Poll GET /approvals until it is approved; your command is then replayed. See Maker-checker over the API.

Retry the exact same call with the same idempotencyKey any time. It will not move the money twice.

5. Read the journal

Every movement ends as a balanced entry in the one ledger. Read it back:

curl -s "$BASE/ledger/entries?from=2026-07-27&to=2026-07-27" \
  -H "Authorization: Bearer $TOKEN" | jq '.[0]'
# → a journal entry: balanced debit and credit lines, a day-book category,
#   business/value/posted dates.

That entry is the same one an operator sees in the console's day book.

Where to go next