{
  "service": "Creditcrest Enrich",
  "version": "1.0.0",
  "engine": "1.0.0",
  "what": "Transactions in; the category, the third party, and how confident it is and why.",
  "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"
      }
    },
    "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}]}",
      "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": "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": "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."
    }
  ]
}