Guide
Assess from a bank statement
Enough history, a reading, and what it can service.
- 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
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.csvimport { 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
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.csvimport { 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
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." } }