Skip to content
WorkspaceDarkLight
Contents

Get started

Quickstart

A sandbox key, then a bank statement read and a loan tested against it. Four calls, on an invented statement.

Each call is in curl, Node and Python. Save a Node example as a .mjs file and run it with Node 18 or later: it uses top-level await. Python needs Python 3 and nothing installed.

  1. 1

    Get a sandbox key

    One call, no account — or one button, which writes your key into the next calls. Keep the key for the calls below: export CREDITCREST_KEY=cc_test_…

    curl -s -X POST https://app.creditcresttechnologies.com.au/v1/keys/sandbox
    const res = await fetch('https://app.creditcresttechnologies.com.au/v1/keys/sandbox', {
      method: 'POST',
    });
    console.log(await res.json());
    import json, urllib.error, urllib.request
    
    req = urllib.request.Request(
        "https://app.creditcresttechnologies.com.au/v1/keys/sandbox",
        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 · 201trimmed
    {
      "key": "cc_test_eyJ2Ijox…",
      "id": "hmw32nop",
      "mode": "test",
      "expires": "2026-12-10"
    }
  2. 2

    Get a statement

    An invented one, as a bank’s CSV export. Any export this reads works the same way.

    Open ↗
    curl -s https://app.creditcresttechnologies.com.au/v1/statement/sample.csv -o statement.csv
    import { writeFile } from 'node:fs/promises';
    
    const res = await fetch('https://app.creditcresttechnologies.com.au/v1/statement/sample.csv');
    await writeFile('statement.csv', await res.text());
    import urllib.request
    
    urllib.request.urlretrieve("https://app.creditcresttechnologies.com.au/v1/statement/sample.csv", "statement.csv")
    Response · 200
    Date,Description,Amount
    05/03/2026,DIRECT CREDIT 049211 ACME LOGISTICS PAYROLL,2200
    19/03/2026,DIRECT CREDIT 049211 ACME LOGISTICS PAYROLL,2320
    02/04/2026,DIRECT CREDIT 049211 ACME LOGISTICS PAYROLL,2440
    …
  3. 3

    Read it

    Income, commitments and expenses, each with the transactions behind it.

    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": []
    }
  4. 4

    Ask what it can service

    The loan goes in the query; the statement stays in the body.

    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"
      }
    }

Next