{
  "service": "Creditcrest Enrich",
  "version": "1.0.0",
  "engine": "1.0.0",
  "what": "Raw bank descriptions in; categories and payees out, each with its reason.",
  "not_advice": "Creditcrest Technologies is not a credit provider, is not a credit assistance provider, and does not hold an Australian credit licence. Its software produces evidence; the licensee makes the decision.",
  "predicts_does_not_decide": "A category is a reading of a description, not a judgement about the person, and a third party is the words a rule recognised in that description rather than a fact about who was paid. Whoever holds the credit licence makes the decision.",
  "nothing_is_kept": "There is no store behind this endpoint. A transaction lives in the request that carried it and in the memory that answered it.",
  "endpoints": {
    "GET /v1/enrich": {
      "what": "One transaction. A link, so an answer somebody disagrees with is a link they can paste into a bug report.",
      "query": {
        "description": "the bank description, exactly as the feed wrote it — store numbers, suburbs and card fragments and all, because resolving those is most of the work",
        "amount": "the amount, signed: credits positive, debits negative. Optional, and some rules cannot be reached without it — a credit from a payroll bureau is wages and a payment to the same name is not",
        "setting": {
          "what": "How far a reading may go past the rules: strict is the rules alone; balanced, the default, adds a modelled reading where its category stays at 95% precision or better; broad, at 90%; complete gives every line a category, guessing where nothing read it, and marks each guess. Any case; every answer says which it was read under",
          "takes": [
            "strict",
            "balanced",
            "broad",
            "complete"
          ]
        }
      }
    },
    "POST /v1/enrich": {
      "what": "A list of transactions, up to 20,000 in one request, with the coverage of the whole list.",
      "body": "{\"transactions\": [{\"id\": \"1\", \"date\": \"2026-08-02\", \"description\": \"WOOLWORTHS 1248 RICHMOND\", \"amount\": -142.86}], \"setting\": \"balanced\"}",
      "bank": "Optional on each transaction: what your bank connection sent beside the description, {\"type\": \"PAYMENT\", \"merchant\": \"Mintjay\", \"merchant_category_code\": \"5814\", \"biller_code\": \"75556\"}. Where no rule reads the words, a merchant category code that settles the line reads it (band \"coded\"), and the merchant’s name is the third party. Not under strict.",
      "query": {
        "setting": {
          "what": "How far a reading may go past the rules: strict is the rules alone; balanced, the default, adds a modelled reading where its category stays at 95% precision or better; broad, at 90%; complete gives every line a category, guessing where nothing read it, and marks each guess. Any case; every answer says which it was read under",
          "takes": [
            "strict",
            "balanced",
            "broad",
            "complete"
          ]
        }
      },
      "setting_from": "the body’s \"setting\", or ?setting= where the body has none — a bare array can only use the query",
      "content_type": "application/json",
      "note": "A list travels in a body rather than a query string, because a URL carrying somebody’s transactions ends up in a browser history, a referrer header and a proxy log."
    },
    "GET /v1/enrich/rules": {
      "what": "What the engine is made of: the categories it can assign and how many rules it holds."
    },
    "GET /v1/enrich/accuracy": {
      "what": "What it gets right, measured against payee lists nobody here chose, per category and per confidence band."
    }
  },
  "says_when_it_does_not_know": {
    "word": "unknown",
    "how": "category.known is false and third_party.known is false. The category code is \"uncategorised\" and third_party.name is null.",
    "why": "Not \"other\". A label that hid the gap would leave a caller unable to tell a payee this read from a payee it invented a line for, and the measured gap is large enough that the difference matters."
  },
  "bands": [
    {
      "band": "named",
      "confidence": 0.99,
      "knows": "category+party",
      "why": "A rule matched the merchant’s name in the description."
    },
    {
      "band": "kind",
      "confidence": 0.99,
      "knows": "category",
      "why": "A rule matched a word for a kind of business inside a name this has never seen. It puts the money on the right line and it does not identify the payee."
    },
    {
      "band": "paired",
      "confidence": 0.95,
      "knows": "category",
      "why": "The holder’s own money moving between their accounts: an app’s split of a payment into a saver, or that share arriving in the saver the same day for the same amount, whatever name it carries. Not yet measured on labelled statements."
    },
    {
      "band": "coded",
      "confidence": 0.9,
      "knows": "category",
      "why": "No rule matched the words. The bank sent a code that settles the line: the card scheme’s code for the kind of business, or its own word for a fee or interest. Not yet measured on labelled statements."
    },
    {
      "band": "listed",
      "confidence": 0.99,
      "knows": "category+party",
      "why": "No rule matched the words. A public register names the business and says what kind it is: Wikidata by the web address on the line, a register of organisations (charities, councils, health funds, universities, chains) by their name, or a register of Australian places (Overture Maps, Foursquare and state registers) by these words in the suburb the line names. Measured on public registers and sample statements, not yet on lenders’ statements."
    },
    {
      "band": "modelled",
      "confidence": 0.99,
      "knows": "category",
      "why": "No rule matched. A model fitted in this repository read the words; the confidence is the share of its answers at this score, in this category, that were right on lines held apart to measure it."
    },
    {
      "band": "inferred",
      "confidence": 0.35,
      "knows": "none",
      "why": "No rule matched. The size and direction of the money were used instead, which is a guess and is marked as one."
    },
    {
      "band": "guessed",
      "confidence": 0.35,
      "knows": "category",
      "why": "Nothing read the line, and the complete setting gives every line a category: this is the model’s best guess, a spending line for money out and a transfer for money in. Most such guesses are wrong; it is marked as one."
    },
    {
      "band": "declined",
      "confidence": 0,
      "knows": "party",
      "why": "The name is recognised and is deliberately not categorised, because the name does not settle what the payment was."
    },
    {
      "band": "unknown",
      "confidence": 0,
      "knows": "none",
      "why": "Nothing in the description matched a rule."
    }
  ],
  "settings": [
    {
      "setting": "strict",
      "default": false,
      "target": null,
      "modelled": false,
      "says": "The rules alone. Every answer is a name or a kind of business a rule read."
    },
    {
      "setting": "balanced",
      "default": true,
      "target": 0.95,
      "modelled": true,
      "says": "The rules, the bank’s merchant code where a connection sent one, a register of Australian places, and a modelled reading where it keeps its category at 95% precision or better."
    },
    {
      "setting": "broad",
      "default": false,
      "target": 0.9,
      "modelled": true,
      "says": "More answers. The bank’s merchant code where a connection sent one, a register of Australian places, and a modelled reading where it keeps its category at 90% precision or better."
    },
    {
      "setting": "complete",
      "default": false,
      "target": null,
      "modelled": true,
      "says": "Every line gets a category. Read as broad reads, and where nothing read a line, the model’s best guess, marked as one: money out as a spending line, money in as a transfer. Never income, a commitment or gambling on a guess, and not held to a precision floor."
    }
  ],
  "default_setting": "balanced"
}