Moroku Enrich · Transaction enrichment API

Turn a bank descriptor into a category you can defend.

Enrich reads raw Australian transaction text and returns a category, a classification and the reason it chose them. Every answer is cited, and every result can be reproduced.

17expense categories
3classifications
100%of results carry source and confidence
Try it: enrich a transactionIllustrative
Raw descriptor
Why Enrich

One categorisation engine for every product that reads a transaction.

Most transaction categorisation is a stack of brand-matching rules that drifts between products, ignores the merchant category code already sitting on the data, and quietly files anything it does not recognise as discretionary. That last habit flatters affordability, which is exactly the wrong direction for a lender.

Enrich replaces the stack with a single service. A merchant classified once is classified for every product afterwards, so the Australian merchant dictionary behind it compounds in value. Moroku holds that dictionary itself, so no additional third party processes your customers' data.

01

Auditable

Every response carries its source, confidence and engine_version. "Groceries, because MCC 5411, engine 1.3.0" is a statement a credit team can stand behind. Pin a version and a historical batch replays to exactly the same report.

Built for RG 209 review
02

Conservative

Unknown spend is flagged unverified and classified essential, never silently discretionary. Affordability is never flattered by what the engine does not know, which is the part a responsible-lending reviewer cares about.

Won't overstate capacity
03

Deterministic first

Merchant category code tables and dictionary lookups give the same answer every time and cite their reason. A language model classifies each unknown merchant exactly once; from then on its cached answer is deterministic too.

Same input, same output
How it works

A priority chain. The first hit wins.

Every transaction runs the chain in order. Cheap, certain signals are consulted before probabilistic ones, so a confident answer is never second-guessed by a weaker tier. Statement lines carry no merchant category code, so that step is simply skipped for them.

  1. 1ExclusionsTransfers, ATM withdrawals, cash advancestransfer
  2. 2SavingsDirected deposits and withdrawalssavings
  3. 3IncomeRecognised salary and benefitsincome
  4. 4CreditAny other credituncategorised_credit
  5. 5User and tenant overridesLearned from correctionsuser_override
  6. 6MCC tableISO 18245 merchant category codes mapped to the taxonomymcc · 0.95
  7. 7Global dictionaryThe compounding Australian merchant mapdictionary
  8. 8RulesPattern rules as the deterministic floorrules · 0.70
  9. 9Language model classificationOnce per new merchant, then cachedllm_cache
  10. 10Conservative fallbackother_expenses · essential · unverifiedfallback
Deterministic: same answer every time Probabilistic, then cached or held conservative
The taxonomy

17 expense categories, 3 classifications, versioned.

Each category carries a default classification, and that classification is the axis that drives affordability. The taxonomy is served by GET /v1/taxonomy, so every consumer reads the same version rather than hard-coding its own copy.

Essential

Spend a household cannot easily avoid.

groceriesutilitiesvehicle_runningtransportinsurancestrataeducationhealthcare

Financial commitment

Obligations a lender must see.

mortgagerentloan_repaymentbnpl

Discretionary

Spend that can flex when budgets tighten.

subscriptionsdining_entertainmentclothinggeneral_retailother_expenses

Non-expense outcomes

Returned explicitly and marked excluded, so they never land in spend. The consumer decides whether to drop them.

transferincomesavings_depositsavings_withdrawaluncategorised_credit
The API

Batch in, enriched out. JSON all the way.

A per-tenant bearer key, up to 1,000 transactions per call, and idempotent writes through an Idempotency-Key header.

POST/v1/categoriseBatch categorisation, up to 1,000 transactions
POST/v1/correctionsThe learning loop: user, then tenant, then global
GET/v1/taxonomyCategories, classifications and versions
GET/v1/merchants/{match_key}Current mapping, source and confidence
GET/v1/healthLiveness, engine and taxonomy versions

base  https://enrich.moroku.digital
auth  Authorization: Bearer mk_live_… (or mk_test_…)

POST /v1/categoriseRequest
{
  "transactions": [{
    "id": "t1",
    "description": "SQ *THE DAILY GRIND 4821 SYDNEY AU",
    "mcc": "5814",
    "amount": -5.60,
    "date": "2026-07-14"
  }]
}
200 OKResponse
{
  "results": [{
    "id": "t1",
    "category": "dining_entertainment",
    "classification": "discretionary",
    "confidence": 0.95,
    "source": "mcc",
    "excluded": false,
    "merchant": { "match_key": "the daily grind" },
    "engine_version": "1.3.0"
  }],
  "summary": { "confident_pct": 1.0 // share at ≥ 0.8 }
}
Get access

Request a key and make your first call.

Access is by request today. Tell us the product and expected volume and we issue a per-tenant key pair: a test environment to build against and a live one for real traffic.

Built in

Moroku customers

Institutions running Moroku Kanopi, Odyssey or Money.

Included with your platformUsage metered per tenant from day one

  • Test and live keys on request
  • Full categorise, corrections and taxonomy API
  • Per-tenant usage reporting
  • Learning scoped to your tenant
Commercial

Australian fintechs

Lenders, brokers and advisers building their own products.

Per 1,000 transactionsPricing by arrangement

  • The same API and Australian taxonomy
  • Developer agreement and onboarding
  • Isolated tenant: your learning stays yours
  • Only merchant-level facts are ever shared

From request to first call

  1. STEP 1

    Request a key

    Send us the product name and expected volume. We issue your test and live keys and hand them over securely.

  2. STEP 2

    Integrate

    Point your client at /v1/categorise with the bearer key, batch your transactions, and read category and confidence.

  3. STEP 3

    Close the loop

    When a user recategorises a transaction, post it to /v1/corrections. Enrich learns, and every consumer benefits at the next sync.

Talk to us about Enrich

Tell us what you are building and roughly how many transactions a month.