Skip to content

Direct Debit Flow

Direct debit payments require a customer record and a stored bank account. Once the bank account is tokenised as a payment instrument, transactions are submitted and settle asynchronously. The final result is delivered via webhook. It is also available via transaction reports, and queries.

Steps: Create Customer → Add Bank Account → Process Transaction

Step 1: Create a Customer

If you don’t already have a customer record, create one first.

Endpoint: POST /customers

For complete field documentation, see Create a Customer.

Example Request:

{
"name": "Jane Smith",
"email": "janesmith@example.com"
}

Response:

{
"id": "YJaKdxGP6UGn_kk4OCDqUQ",
"name": "Jane Smith",
"email": "jXXXXXXXXXX@example.com",
"reference": "CUST-001",
"createdDateTime": "2026-05-06T01:24:56Z",
"updatedDateTime": "2026-05-06T01:24:56Z",
"count": 0,
"paymentInstruments": [],
"result": {
"status": "ok"
}
}

Step 2: Add a Bank Account

Add the customer’s bank account as a payment instrument. This tokenises the account details and returns an instrument ID you can reuse for future transactions.

Endpoint: POST /customers/{customerId}/PaymentInstruments

For complete field documentation, see Create a Payment Instrument.

Example Request:

{
"reference": "INV-2026-001",
"bankAccount": {
"accountName": "John Smith",
"bsb": "064000",
"number": "12345678"
}
}

Response:

{
"reference": "FwBZ5ldAj0yOuIk84m0XPA",
"id": "z2CtwzPuZUqLYqLHPRHPaw",
"type": "bank_account",
"createdDateTime": "2026-05-06T01:03:59Z",
"updatedDateTime": "2026-05-06T01:03:59Z",
"bankAccount": {
"accountName": "John Smith",
"bsb": "064000",
"number": "XXXXXX78"
},
"metadata": {
"bankName": "Commonwealth Bank of Australia"
},
"result": {
"status": "ok"
}
}

Step 3: Process a Transaction

Submit a direct debit transaction using the customer ID and payment instrument ID. The response status is pending because the bank settles the debit asynchronously.

Endpoint: POST /transactions

For complete field documentation, see Create a Transaction.

Example Request:

{
"reference": "INV-2026-001",
"payment": {
"amount": 5000,
"instrument": {
"customer": {
"id": "YJaKdxGP6UGn_kk4OCDqUQ",
"paymentInstrumentId": "z2CtwzPuZUqLYqLHPRHPaw"
}
}
}
}

Response:

{
"id": "FbDnBIDc_US4vbjbG5kX0Q",
"reference": "INV-2026-001",
"createdDateTime": "2026-05-06T01:33:05Z",
"updatedDateTime": "2026-05-06T01:33:05Z",
"category": {
"method": "purchase",
"source": "direct_debit"
},
"payment": {
"amount": 5000,
"currencyCode": "AUD",
"instrument": {
"customer": {
"id": "YJaKdxGP6UGn_kk4OCDqUQ",
"paymentInstrumentId": "z2CtwzPuZUqLYqLHPRHPaw"
}
}
},
"result": {
"mode": "sandbox",
"status": "pending"
}
}

Step 4: Receive the Webhook

When the bank processes and settles the debit, the API sends a webhook with the final result. The result.status will be approved or declined. The result is also available via transaction reports and queries.

Note: Configure your webhook endpoint in the API settings. See Webhooks for more details.

Flow Diagram

sequenceDiagram
    autonumber
    participant Customer
    participant Merchant Server
    participant Single API

    Customer->>Merchant Server: Provide bank account details and authorise debit
    Merchant Server->>Single API: POST /customers
    Single API-->>Merchant Server: Customer ID
    Merchant Server->>Single API: POST /customers/{id}/PaymentInstruments
    Single API-->>Merchant Server: Payment Instrument ID (token)
    Merchant Server->>Single API: POST /transactions (customer ID + instrument ID)
    Single API-->>Merchant Server: status: pending
    Note over Single API: Bank processes debit asynchronously
    Single API-->>Merchant Server: Webhook: approved or declined
    Merchant Server-->>Customer: Display result

Bank Account Formats

Australia

Australian bank accounts require a BSB (Bank State Branch), an account number, and an account name submitted as separate fields.

accountName must match the payer name recorded by the financial institution. To support successful processing, provide the name exactly as held by the bank.

FieldFormatExample
accountName32 charsJohn Smith
bsb6 digits064000
number6-9 digits12345678
{
"bankAccount": {
"accountName": "John Smith",
"bsb": "064000",
"number": "12345678"
}
}

New Zealand

New Zealand bank accounts require an account number and an account name submitted as separate fields.

accountName must match the payer name recorded by the financial institution. To support successful processing, provide the name exactly as held by the bank.

New Zealand bank accounts use a 16-digit number structured as BB-bbbb-AAAAAAA-SSS:

PartDescriptionDigits
BBBank code2
bbbbBranch code4
AAAAAAAAccount body7
SSSSuffix (account type)2-3

You can submit the number with, or without hyphens:

{
"bankAccount": {
"accountName": "John Smith",
"number": "0100011234567123"
}
}
{
"bankAccount": {
"accountName": "John Smith",
"number": "01-0001-1234567-123"
}
}

The API always returns the account number masked and formatted with hyphens:

{
"bankAccount": {
"accountName": "John Smith",
"number": "01-0001-XXXXX67-123"
}
}

Example Request (NZ):

{
"reference": "INV-2026-001",
"bankAccount": {
"accountName": "John Smith",
"number": "01-0001-1234567-123"
}
}

NZ Response:

{
"reference": "FwBZ5ldAj0yOuIk84m0XPA",
"id": "z2CtwzPuZUqLYqLHPRHPaw",
"type": "bank_account",
"createdDateTime": "2026-05-06T01:03:59Z",
"updatedDateTime": "2026-05-06T01:03:59Z",
"bankAccount": {
"accountName": "John Smith",
"number": "01-0001-XXXXX67-123"
},
"metadata": {
"bankName": "ANZ Bank New Zealand"
},
"result": {
"status": "ok"
}
}