NPP Last Domestic Leg

NPP Last Domestic Leg lets eligible remittance customers complete the final domestic leg of an International Funds Transfer Instruction (IFTI) in real time over the New Payments Platform (NPP), in AUD, instead of via Direct Entry (DE) or RTGS. The required international transfer information is carried on the payment.

It provides richer data and stronger financial-crime controls on the domestic leg of inbound international payments. Zai connects to NPP through Cuscal.

Key benefits

  • Real-time settlement of the final domestic leg, removing the multi-day wait of DE/RTGS — important for remittance recipients.
  • Real-time status tracking via webhooks.
  • Richer compliance data carried with each payment to support NPP Last Domestic leg data requirements.

Eligibility and access (read first)

❗️

IPS Payer is not self-service

It is enabled only after a dedicated onboarding and approval process.

Two conditions must be met before Zai can switch it on:

  1. You report your IFTIs to AUSTRAC. Only customers meeting their International Funds Transfer Instruction reporting obligations are eligible. You will be asked to evidence this. Zai provides the payment rail; you remain the reporting entity for your IFTIs.
  2. Cuscal/AP+ have approved your use case. Your end-to-end fund flow is reviewed and approved, and certification testing is completed, before go-live.

To get started, contact your Account Manager — they'll guide you through enabling this service for your platform.

Prerequisites

  • Zai account with NPP Last Domestic Leg enabled (via the onboarding process above).
  • OAuth2 authentication implemented — see the Authentication Guide.
  • Webhooks configured — see the Webhook Guide.
  • Users created in Zai, with a bank account created for payouts and a funded wallet.
  • Sandbox access via dashboard.hellozai.com.

How it works

There are two distinct API interactions. Do not confuse them:

  1. Bank account creation → Confirmation of Payee (CoP) name check. When a payout bank account is created, Zai performs an account-name matching (CoP) lookup and returns the match result. This validates the beneficiary; it does not move money.
  2. Withdraw call → NPP Last Domestic Leg payout. The final domestic leg payout is initiated explicitly by calling the NPP Last Domestic leg withdraw endpoint with the required IFTI information. This is the step that sends funds over NPP.
  3. Webhook → confirmation. A webhook confirms the payout was processed via NPP and that the IFTI information was recorded on the payment.

Quick start

1. Create a user

curl -X POST https://test.api.promisepay.com/users \
  -H "Authorization: Bearer {oauth_token}" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "seller_456",
    "first_name": "Jane",
    "last_name": "Smith",
    "email": "[email protected]",
    "country": "AUS"
  }'

2. Create the payout bank account (triggers CoP name check)

curl -X POST https://test.api.promisepay.com/bank_accounts \
  -H 'content-type: application/json' \
  -d '{
    "user_id": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
    "bank_name": "Bank of Australia",
    "account_name": "Samuel Seller",
    "routing_number": "111123",
    "account_number": "111234",
    "account_type": "checking",
    "holder_type": "personal",
    "country": "AUS"
  }'

3. Initiate the last domestic leg payout (NPP Last Domestic Leg)

curl --request POST \
     --url https://test.api.promisepay.com/wallet_accounts/bd6e9c20-73f1-0138-fb91-0a58a9feac09/npp_last_domestic_leg \
     --header 'accept: application/json' \
     --header 'content-type: application/json' \
     --data '
{
  "account_id": "c1824ad0-73f1-0138-3700-0a58a9feac09",
  "amount": 173,
  "custom_descriptor": "",
  "reference_id": "7190770-1-2908",
  "end_to_end_id": "PRTYAUXXXX",
  "ifti_information": {
    "instruction_identification": "BANKNTSTXXXI20180501000000000000010",
    "ultimate_debtor_information": {
      "name": "John Doe",
      "address": {
        "address_type": "ADDR",
        "department": "Finance",
        "sub_department": "Billing",
        "street_name": "Kent",
        "bldg_name": "123",
        "postcode": "2000",
        "town_name": "Sydney",
        "ctry_sub_division": "NSW",
        "country_code": "AU",
        "address_line": [
          "string"
        ]
      },
      "organisation_identification": [
        {
          "identification": "string",
          "identification_type_proprietary": "string",
          "identification_type_code": "BBAN",
          "identification_issuer": "string"
        }
      ],
      "organisation_bic": "SMPLAU2SXXX",
      "private_identification": [
        {
          "identification": "string",
          "identification_type_proprietary": "string",
          "identification_type_code": "BBAN",
          "identification_issuer": "string"
        }
      ],
      "date_place_of_birth": {
        "birth_date": "2026-06-11",
        "place_of_birth": "string",
        "city_of_birth": "string",
        "country_of_birth": "AU"
      },
      "country_of_residence": "AU",
      "contact_details": {
        "name_prefix": "DOCT",
        "name": "string",
        "phone_number": "string",
        "mobile_number": "string",
        "fax_number": "string",
        "email_address": "string",
        "other": "string"
      }
    },
    "charge_bearer": "CRED",
    "previous_instructing_agent": {
      "agent_bic": "YOURBIC1234",
      "clearing_system_identification": "BICCODE123",
      "clearing_system_member_identification": "BICCODE123MEM"
    },
    "creditor_agent_instruction": {
      "instruction_information": "sample",
      "code": "CHQB"
    },
    "initiating_party_information": {
      "name": "John Doe",
      "address": {
        "address_type": "ADDR",
        "department": "Finance",
        "sub_department": "Billing",
        "street_name": "Kent",
        "bldg_name": "123",
        "postcode": "2000",
        "town_name": "Sydney",
        "ctry_sub_division": "NSW",
        "country_code": "AU",
        "address_line": [
          "string"
        ]
      },
      "organisation_identification": [
        {
          "identification": "string",
          "identification_type_proprietary": "string",
          "identification_type_code": "BBAN",
          "identification_issuer": "string"
        }
      ],
      "organisation_bic": "SMPLAU2SXXX",
      "private_identification": [
        {
          "identification": "string",
          "identification_type_proprietary": "string",
          "identification_type_code": "BBAN",
          "identification_issuer": "string"
        }
      ],
      "date_place_of_birth": {
        "birth_date": "2026-06-11",
        "place_of_birth": "string",
        "city_of_birth": "string",
        "country_of_birth": "AU"
      },
      "country_of_residence": "AU",
      "contact_details": {
        "name_prefix": "DOCT",
        "name": "string",
        "phone_number": "string",
        "mobile_number": "string",
        "fax_number": "string",
        "email_address": "string",
        "other": "string"
      }
    },
    "ultimate_creditor_information": {
      "name": "John Doe",
      "address": {
        "address_type": "ADDR",
        "department": "Finance",
        "sub_department": "Billing",
        "street_name": "Kent",
        "bldg_name": "123",
        "postcode": "2000",
        "town_name": "Sydney",
        "ctry_sub_division": "NSW",
        "country_code": "AU",
        "address_line": [
          "string"
        ]
      },
      "organisation_identification": [
        {
          "identification": "string",
          "identification_type_proprietary": "string",
          "identification_type_code": "BBAN",
          "identification_issuer": "string"
        }
      ],
      "organisation_bic": "SMPLAU2SXXX",
      "private_identification": [
        {
          "identification": "string",
          "identification_type_proprietary": "string",
          "identification_type_code": "BBAN",
          "identification_issuer": "string"
        }
      ],
      "date_place_of_birth": {
        "birth_date": "2026-06-11",
        "place_of_birth": "string",
        "city_of_birth": "string",
        "country_of_birth": "AU"
      },
      "country_of_residence": "AU",
      "contact_details": {
        "name_prefix": "DOCT",
        "name": "string",
        "phone_number": "string",
        "mobile_number": "string",
        "fax_number": "string",
        "email_address": "string",
        "other": "string"
      }
    },
    "instructed_amount": {
      "currency": "AUD",
      "amount": "3.25"
    },
    "exchange_rate": "1.23",
    "payment_purpose_proprietary": "Prtry",
    "payment_information": {
      "remittance_information_unstructured": "MAP_RE_Happy",
      "payment_purpose_code": "EPAY"
    },
    "regulatory_reporting": [
      {
        "authority_name": "Name"
      }
    ],
    "remittance_information_structured": {
      "referred_document_amount": {
        "due_payable_amount": {
          "currency": "AUD",
          "amount": "3.25"
        }
      }
    },
    "related_remittance_information": [
      {
        "identification": "S010"
      }
    ]
  }
}

API reference — withdraw request (top-level fields)

FieldRequiredNotes
account_idYesThe payout bank account (beneficiary) created in step 2.
amountYesPayout amount in cents.
reference_idYesYour unique reference for the payout. Use for idempotency/reconciliation.
end_to_end_idYesEnd-to-end identifier carried across the payment chain.
custom_descriptorNoOptional descriptor. No change to bank-statement narrative vs standard domestic payouts.
ifti_informationYesObject carrying the IFTI data. See below.

API reference — ifti_information (required fields)

FieldRequiredRules / enumeration
instruction_identificationYesExactly 35 characters. Other lengths are rejected.
ultimate_debtor_informationYesDebtor (remittance customer) details, including address.
…address.address_typeYesOne of: ADDR, BIZ, DLVY, HOME, MLTO, PBOX. Other values rejected (RV01).
charge_bearerYese.g. CRED, DEBT, SHAR, SLEV.
previous_instructing_agentYesBIC of the FI immediately preceding Cuscal/Zai. Checked against your approved fund flow.
creditor_agent_instructionYesBIC of the original FI in the chain. Checked against your approved fund flow.
initiating_party_informationYesInitiating party details.
instructed_amountYes{ currency, amount }amount is a decimal string in major units (e.g. "173.00").
ultimate_creditor_informationRecommendedBeneficiary details where applicable.

The table above covers the key ifti_information fields only. Please check our API reference document for initiating the last domestic leg payout to see the full IFTI information that can be provided as part of the last domestic leg payout request.

Webhooks

After initiating the payout, verify via webhook that it was processed over NPP and that the IFTI information was recorded. Reconcile at least: reference_id, end_to_end_id, amount, status, and the presence of the IFTI block.

{
  "event": "payout.completed",
  "reference_id": "7190770-1-2908",
  "end_to_end_id": "PRTYAUXXXX",
  "rail": "NPP",
  "status": "completed",
  "ifti_information_recorded": true
}

Error handling and fallback

ScenarioBehaviourWhat to do
Missing mandatory fieldRequest rejected with a required-field error.Populate all mandatory IFTI fields before sending.
Invalid format / enumRejected (e.g. RV01) — e.g. instruction_identification not 35 chars, or invalid address_type.Validate length and enumerations client-side.
Source account not recognised by CuscalRejected at scheme level.Raised during onboarding, not by integrators; contact Zai if seen.
Beneficiary not NPP-reachableFalls back to Direct Entry if the marketplace is configured for DE fallback; otherwise funds return to the user wallet.On DE fallback the IFTI information is not carried — this affects your own reporting. Handle both outcomes.

Example rejection

{
  "error_code": "RV01",
  "error_message": "ifti_information.instruction_identification ... invalid format."
}

Glossary (external name → internal identifiers)

TermMeaning
NPP Last Domestic LegExternal product name.
IPSNPP International Payments Service (AP+/NPP), governing the domestic leg of inbound international payments.
Withdraw endpointPOST /wallet_accounts/{wallet_id}/npp_last_domestic_leg
Feature configurationnpp_ifti_payer (internal toggle that enables the feature for a marketplace).
IFTIInternational Funds Transfer Instruction (AUSTRAC reporting concept).
CoPConfirmation of Payee — account-name matching at bank-account creation.

Support

FAQs

1. Can I tell Last Domectic Leg payouts apart from standard domestic payouts?
Yes — NPP Last Domestic Leg payout uses a dedicated withdraw endpoint and validates the required IFTI fields before processing over NPP.

2. What appears on the beneficiary's bank statement?
No change versus standard domestic payouts — the same reference/description applies.

3. How do I reconcile Last Domestic Leg payouts?
The same way as your existing domestic payout reconciliation.

4. What happens if the beneficiary account is not NPP-reachable?
If your marketplace is configured for DE fallback, the payout goes via Direct Entry and IFTI information is not carried. Otherwise funds return to the user wallet.

5. Who can use NPP Last Domestic Leg Service?
Only clients meeting their IFTI reporting obligations (typically to AUSTRAC). Eligibility is confirmed by Zai's Risk & Compliance team during onboarding; proof of the reporting obligation is required.