Skip to content
WorkspaceDarkLight
Contents

Guide

Assess from a bank statement

Enough history, a reading, and what it can service.

  1. 1

    Check there is enough history

    How many days of statement the product needs, and whether the accounts held cover them.

    curl -s -X POST https://app.creditcresttechnologies.com.au/v1/evidence/coverage \
      -H "authorization: Bearer $CREDITCREST_KEY" \
      -H 'content-type: application/json' \
      -d '{"product":"sacc","accounts":[{"id":"everyday","role":"income","from":"2026-03-01","to":"2026-08-28"}],"applicationDay":"2026-08-31"}'
    const res = await fetch('https://app.creditcresttechnologies.com.au/v1/evidence/coverage', {
      method: 'POST',
      headers: {
        authorization: `Bearer ${process.env.CREDITCREST_KEY}`,
        'content-type': 'application/json',
      },
      body: JSON.stringify({
        "product": "sacc",
        "accounts": [
          {
            "id": "everyday",
            "role": "income",
            "from": "2026-03-01",
            "to": "2026-08-28"
          }
        ],
        "applicationDay": "2026-08-31"
      }),
    });
    console.log(await res.json());
    import json, os, urllib.error, urllib.request
    
    req = urllib.request.Request(
        "https://app.creditcresttechnologies.com.au/v1/evidence/coverage",
        data=json.dumps({
            "product": "sacc",
            "accounts": [
                {
                    "id": "everyday",
                    "role": "income",
                    "from": "2026-03-01",
                    "to": "2026-08-28",
                },
            ],
            "applicationDay": "2026-08-31",
        }).encode(),
        headers={
            "Authorization": "Bearer " + os.environ["CREDITCREST_KEY"],
            "Content-Type": "application/json",
        },
        method="POST",
    )
    try:
        with urllib.request.urlopen(req) as res:
            print(json.load(res))
    except urllib.error.HTTPError as e:
        print(json.load(e))
    Response · 200trimmed
    {
      "complete": true,
      "requirement": {
        "incomeAccountDays": 90,
        "why": "90 days (statute: NCCP Act ss 117(1A), 130(1A))"
      },
      "accounts": [
        {
          "role": "income",
          "needs": 90,
          "covered": true
        }
      ]
    }
  2. 2

    Read the statement

    The same call as the quickstart. Reference

    curl -s -X POST https://app.creditcresttechnologies.com.au/v1/statement \
      -H "authorization: Bearer $CREDITCREST_KEY" \
      -H 'content-type: text/csv' \
      --data-binary @statement.csv
    import { readFile } from 'node:fs/promises';
    
    const res = await fetch('https://app.creditcresttechnologies.com.au/v1/statement', {
      method: 'POST',
      headers: {
        authorization: `Bearer ${process.env.CREDITCREST_KEY}`,
        'content-type': 'text/csv',
      },
      body: await readFile('statement.csv'),
    });
    console.log(await res.json());
    import json, os, urllib.error, urllib.request
    
    req = urllib.request.Request(
        "https://app.creditcresttechnologies.com.au/v1/statement",
        data=open("statement.csv", "rb").read(),
        headers={
            "Authorization": "Bearer " + os.environ["CREDITCREST_KEY"],
            "Content-Type": "text/csv",
        },
        method="POST",
    )
    try:
        with urllib.request.urlopen(req) as res:
            print(json.load(res))
    except urllib.error.HTTPError as e:
        print(json.load(e))
    Response · 200trimmed
    {
      "period": {
        "from": "2026-03-01",
        "to": "2026-08-28",
        "days": 181,
        "months": 5.95
      },
      "income": {
        "verifiedMonthly": 5026.67,
        "regular": [
          {
            "description": "DIRECT CREDIT 049211 ACME LOGISTICS PAYROLL",
            "period": "fortnightly",
            "monthly": 5026.67,
            "transactions": ["r1", "r2", "r3", …]
          }
        ]
      },
      "commitments": {
        "monthly": 2150
      },
      "expenses": {
        "monthly": {
          "essential": 3497.94,
          "discretionary": 162.68
        }
      },
      "signals": []
    }
  3. 3

    Test the loan

    Serviceability at the buffered rate, and the most it could borrow. Reference

    curl -s -X POST 'https://app.creditcresttechnologies.com.au/v1/capacity?loan=15000&rate=12&years=5' \
      -H "authorization: Bearer $CREDITCREST_KEY" \
      -H 'content-type: text/csv' \
      --data-binary @statement.csv
    import { readFile } from 'node:fs/promises';
    
    const res = await fetch('https://app.creditcresttechnologies.com.au/v1/capacity?loan=15000&rate=12&years=5', {
      method: 'POST',
      headers: {
        authorization: `Bearer ${process.env.CREDITCREST_KEY}`,
        'content-type': 'text/csv',
      },
      body: await readFile('statement.csv'),
    });
    console.log(await res.json());
    import json, os, urllib.error, urllib.request
    
    req = urllib.request.Request(
        "https://app.creditcresttechnologies.com.au/v1/capacity?loan=15000&rate=12&years=5",
        data=open("statement.csv", "rb").read(),
        headers={
            "Authorization": "Bearer " + os.environ["CREDITCREST_KEY"],
            "Content-Type": "text/csv",
        },
        method="POST",
    )
    try:
        with urllib.request.urlopen(req) as res:
            print(json.load(res))
    except urllib.error.HTTPError as e:
        print(json.load(e))
    Response · 200trimmed
    {
      "service": {
        "assessmentRate": 0.15,
        "monthlySurplus": 1009.2,
        "netSurplusRatio": 0.2008,
        "debtServiceRatio": 0.4987
      },
      "capacity": {
        "principal": 57300,
        "binds": "serviceability"
      }
    }
  4. 4

    Check one line

    Any transaction, categorised with its reason. Reference

    Open ↗
    curl -s 'https://app.creditcresttechnologies.com.au/v1/enrich?description=WOOLWORTHS%201234%20SYDNEY&amount=-84.20'
    const res = await fetch('https://app.creditcresttechnologies.com.au/v1/enrich?description=WOOLWORTHS%201234%20SYDNEY&amount=-84.20');
    console.log(await res.json());
    import json, urllib.error, urllib.request
    
    try:
        with urllib.request.urlopen("https://app.creditcresttechnologies.com.au/v1/enrich?description=WOOLWORTHS%201234%20SYDNEY&amount=-84.20") as res:
            print(json.load(res))
    except urllib.error.HTTPError as e:
        print(json.load(e))
    Response · 200trimmed
    {
      "category": {
        "code": "groceries",
        "label": "Groceries",
        "group": "essential",
        "known": true,
        "detail": null
      },
      "third_party": {
        "name": "WOOLWORTHS",
        "known": true,
        "basis": "name"
      },
      "confidence": {
        "value": 0.99,
        "band": "named",
        "why": "A rule matched the merchant’s name in the description."
      }
    }