---
updatedAt: 2026-09-21T23:49:16.000Z
agentTools:
  projectIndex: https://developers.akahu.nz/llms.txt
---

# Demo Bank

Find out how to use Akahu's Demo Bank to test your integration

For non-production environments, Akahu offers a Demo Bank connection for application development and testing. Demo Bank can be used for both one-off and enduring connections. It is also possible to connect to Demo Bank in MyAkahu for [Personal App](/docs/personal-apps) development.

> 📘
>
> Demo Bank is useful for testing purposes, however it does not fully mimic the behaviour of live connections. Please check our [feature support](#feature-support) table to see what functionality is currently available. We strongly recommend that you test your application with real institutions before going live.

## Connecting to Demo Bank

There are two ways to connect to Demo Bank:

* For **Personal Apps**, you can connect by logging in to [MyAkahu](https://my.akahu.nz), navigating to the **"Developers"** page and adding a new Demo Bank connection. After Demo Bank is connected to your Akahu account, you must also select and share specific Demo Bank accounts with your Personal App via the **"Developers"** page.

* For **Full Apps**, you can connect Demo Bank during the Akahu OAuth flow. Demo Bank will only be available as a connection for non-production environments.

When connecting to Demo Bank, you'll be prompted to enter a username and password. You may enter any value into these fields to continue. In order to simulate an incorrect credential error, the password "Password1" can be entered.

The next screen will simulate a multi-factor authentication screen by asking a simple math question. You must answer this question correctly to complete the connection flow.

## Feature support

The following features are supported for Demo Bank connections.

|                       | Enduring access | One-off access |
| :-------------------- | :-------------- | :------------- |
| Account data          | ✅               | ✅              |
| Transaction data      | ✖️              | ✅              |
| Party (identity) data | ✅               | ✅              |
| Payments              | ✅               | ✅              |
| Webhooks              | ✅               | N/A            |

For further information about using Demo Bank with enduring access features, please see the [enduring access](#enduring-access) section below.

## Enduring access

The information below is relevant if you are using Demo Bank connections with enduring access.

### Accounts

Demo Bank has 4 static accounts:

| Name           | Account Number     | Type      | Notes                                             |
| -------------- | ------------------ | --------- | ------------------------------------------------- |
| Demo Checking  | 99-9999-9999999-91 | CHECKING  | A checking account is useful for testing payments |
| Demo Savings   | 99-9999-9999999-92 | SAVINGS   | A savings account that can't make payments        |
| Demo Overdrawn | 99-9999-9999999-93 | CHECKING  | A checking account that has a negative balance    |
| Demo Kiwisaver | 99-9999-9999999-94 | KIWISAVER | A KiwiSaver account which cannot make payments    |

### Transactions

> ⚠
>
> Transaction data is **not currently supported** for Demo Bank accounts connected with enduring access.
> Transaction related API endpoints will not return any data for Demo Bank accounts.

### Payments

Demo Bank has both a classic connection and an [official open banking](/docs/official-open-banking) connection, matching the two ways that Akahu connects to real banks. Your app's configuration determines which one your users connect to, and payment outcomes differ between them. One-off payments always use the official connection.

#### Choosing a destination account

You should always pay a **real NZ bank account number**. Attempting to pay a Demo Bank account number will fail bank-account validation with an HTTP 400 error.

#### Magic amounts

Demo Bank forces a scripted payment outcome when the amount matches one of the codes below. Amounts are matched to two decimal places, and a leading `105.` is treated as an alias for `5.` (so `105.15` behaves as `5.15`), handy when a demo should not look like it is moving loose change.

Each outcome is listed as `status` / status code. Enduring payments report the code in `status_code`, and one-off payments report it in `status_reason.code`.

| Amount | Description                                 | Official (One-Off)                     | Official (Enduring)                      | Classic                                            |
| ------ | ------------------------------------------- | -------------------------------------- | ---------------------------------------- | -------------------------------------------------- |
| 5.01   | Payment creation fails                      | `500` error response                   | `500` error response                     | `500` error response                               |
| 5.02   | Internal error                              | `FAILED` / `INTERNAL_ERROR`            | `ERROR` / `INTERNAL_ERROR`               | `ERROR` / `INTERNAL_ERROR`                         |
| 5.03   | Bank error                                  | `FAILED` / `BANK_ERROR`                | `ERROR` / `BANK_ERROR`                   | `ERROR` / `BANK_ERROR`                             |
| 5.04   | Indeterminate bank error                    | `FAILED` / `BANK_ERROR_INDETERMINATE`  | `ERROR` / `BANK_ERROR_INDETERMINATE`     | `ERROR` / `BANK_ERROR_INDETERMINATE`               |
| 5.11   | Account not allowed to make payments        | N/A                                    | N/A                                      | `DECLINED` / `INVALID_ACCOUNT`                     |
| 5.14   | Source and destination are the same account | N/A                                    | N/A                                      | `DECLINED` / `INVALID_ACCOUNT`                     |
| 5.15   | Insufficient funds<sup>\*</sup>             | `FAILED` / `REJECTED`                  | `DECLINED` / `REJECTED`                  | `DECLINED` / `INSUFFICIENT_FUNDS`                  |
| 5.16   | Single limit exceeded                       | N/A                                    | `DECLINED` / `SINGLE_LIMIT_EXCEEDED`     | `DECLINED` / `SINGLE_LIMIT_EXCEEDED`               |
| 5.17   | Consent limit exceeded                      | N/A                                    | `DECLINED` / `PERIOD_LIMIT_EXCEEDED`     | `DECLINED` / `DAILY_LIMIT_EXCEEDED`                |
| 5.19   | Consent no longer valid                     | N/A                                    | `DECLINED` / `CONSENT_REVOKED`           | `DECLINED` / `AUTHENTICATION_FAILED`               |
| 5.20   | Short delay, then settles                   | 30s delay, then `SENT`                 | 30s delay, then `SENT`                   | 30s delay, then `SENT`                             |
| 5.22   | Short delay, then fails                     | 30s delay, then `FAILED` / `REJECTED`  | 30s delay, then `DECLINED` / `REJECTED`  | 30s delay, then `DECLINED` / `INSUFFICIENT_FUNDS`  |
| 5.23   | Long delay, then settles                    | 180s delay, then `SENT`                | 180s delay, then `SENT`                  | 180s delay, then `SENT`                            |
| 5.24   | Long delay, then fails                      | 180s delay, then `FAILED` / `REJECTED` | 180s delay, then `DECLINED` / `REJECTED` | 180s delay, then `DECLINED` / `INSUFFICIENT_FUNDS` |

<sup>\*</sup>The NZ Open Banking standards do not reveal the reason for a payment rejection, so the equivalent status code for the official connection is `REJECTED` rather than `INSUFFICIENT_FUNDS`. See [payment status](/docs/official-open-banking-payments#payment-status) for more on this.

> ℹ
>
> Since these payments are simulated, the source account balance will not change after the payment is made.
>
> **Demo Bank does not contain real money.**

### Webhooks

| Supported | Not supported |
| --------- | ------------- |
| TOKEN     | TRANSACTION   |
| ACCOUNT   |               |
| PAYMENT   |               |