PaymentInitiation API

Once you have an active Payment Agreement, you can programmatically initiate eligible payments that comply with its terms.

Collect a payment with the Payment Initiation API

Use the Payment Initiation API to collect an eligible PayTo payment under an active Payment Agreement.

A Payment Initiation is one collection attempt. For a recurring arrangement, your system is responsible for scheduling and creating a new Payment Initiation for each payment that becomes due. Azupay does not automatically create later Payment Initiations from the agreement. Every collection must remain within the amount, frequency and other conditions authorised by the customer in the Payment Agreement.

Let Azupay schedule payments

If you do not want to create each Payment Initiation from your own system, you can use the Payment Schedule API to have Azupay initiate future payments against an ACTIVE Payment Agreement. The schedule and each payment must remain within the terms authorised by the customer.

Learn more about the Payment Schedule API.

🚧

Collect only authorised payments

You must only collect payments you are legally entitled to collect under your commercial arrangement with the customer.

An ineligible payment may be reversed after it has been processed.

API reference

APIPurposeMethod
Initiate a PaymentCreates a PayTo payment against an active Payment Agreement.POST
Get a Payment InitiationRetrieves the latest status using the Payment Initiation ID.GET
Refund a Payment InitiationRefunds all or part of an eligible Payment Initiation.POST
Search for Payment InitiationsFinds Payment Initiations using a merchant transaction ID, Payment Agreement ID or creation-date range.POST

Before you begin

You need:

  • an Azupay client ID for the environment you are using
  • an API key for the same environment
  • an ACTIVE Payment Agreement; if you do not have one, see Create a Payment Agreement
  • an amount that complies with the Payment Agreement
  • a unique clientTransactionId for this collection attempt
  • an HTTPS endpoint if you want to receive status webhooks

Use the client ID and API key issued for the environment you are calling. UAT and production credentials are different.

EnvironmentBase URL
UAThttps://api-uat.azupay.com.au
Productionhttps://api.azupay.com.au

If you plan to receive status webhooks, review Webhooks – Implementation and Security for endpoint and security requirements.

How it works

flowchart TB
    A[Active Payment Agreement] --> B[Create Payment Initiation]
    B --> C[CREATED]
    C -->|Processing continues| D[PENDING]
    C -->|Immediate settlement| E[SETTLED]
    C -->|Immediate rejection| F[FAILED]
    D -->|Settlement confirmed| E
    D -->|Rejected or processing times out| F
    E -->|Later refund or return| G[RETURN_IN_PROGRESS]
    F -.->|Rare: late settlement received| G
    G -->|Return succeeds| H[RETURN_COMPLETE]
    G -->|Return fails| I[RETURN_FAILED]
    H -->|Refund remaining balance| G
    I -->|Retry an eligible refund| G

The create request is asynchronous. A successful HTTP response means Azupay accepted the Payment Initiation; it does not necessarily mean the payment has settled.

Most Payment Initiations follow one of two paths:

  • Immediate outcome: the status changes directly to SETTLED or FAILED.
  • Processing continues: the status changes to PENDING. Azupay monitors the payment until it settles, is rejected or reaches the end of the processing window. If no final outcome is available when that window ends, the status changes to FAILED.

In rare cases, settlement confirmation can arrive after a Payment Initiation has changed to FAILED. Azupay automatically returns those late-arriving funds, as described in Late-arriving funds after FAILED.

Use PaymentInitiationStatus.status to determine the outcome:

  • CREATED and PENDING are non-final states.
  • SETTLED is the successful outcome for the original collection.
  • FAILED is the unsuccessful outcome for the original collection.
  • RETURN_IN_PROGRESS, RETURN_COMPLETE and RETURN_FAILED describe a later refund or return.

You can receive status changes by webhook, retrieve the latest status with the Get Payment Initiation API, or use both approaches.

Step 1: Create a Payment Initiation

Send a POST request to /v1/paymentInitiation.

POST https://api-uat.azupay.com.au/v1/paymentInitiation
Authorization: SECR_MYBUSINESSID_myapikey
Content-Type: application/json
{
  "PaymentInitiation": {
    "clientId": "MYBUSINESSID",
    "clientTransactionId": "INV-0000001-1",
    "paymentAmount": "99.99",
    "paymentAgreementId": "86ea437729e81567218cd013aa5e3d36",
    "reference": "INVOICE-0000001",
    "description": "Monthly subscription payment",
    "paymentInitiationNotification": {
      "endpointURL": "https://merchant.example.com/webhooks/azupay",
      "authorizationHeader": "merchant-generated-secret"
    }
  }
}

Request fields

FieldRequiredType and formatDescription
clientIdYesString, 5–50 charactersYour Azupay client ID for the environment being called.
clientTransactionIdYesString, 5–100 charactersYour unique identifier for this collection attempt. Keep this value so you can safely retry an uncertain create request.
paymentAmountYesString containing an amount greater than zero with exactly two decimal placesThe amount in AUD to collect. It must comply with the Payment Agreement. Zero-dollar payments are not supported.
paymentAgreementIdYesStringThe ID of the active Payment Agreement authorising the collection.
referenceNoPrintable ASCII string, 1–35 charactersAn end-to-end transaction reference. It is passed through the payment message and appears on the payer's statement.
descriptionNoString, 5–280 charactersRemittance information that describes the payment.
paymentInitiationNotificationNoObjectPer-payment webhook configuration. Both nested fields are required when the object is included.
paymentInitiationNotification.endpointURLWhen the notification object is includedPublic HTTPS URLThe endpoint Azupay calls when the Payment Initiation status changes.
paymentInitiationNotification.authorizationHeaderWhen the notification object is includedStringThe value Azupay sends in the webhook's HTTP Authorization header. It is masked as **** in API responses.
metaDataNoObject containing up to 10 string fieldsMerchant-defined metadata. Field names are limited to 40 ASCII characters and values to 255 ASCII characters.
additionalDetailsNoObjectAudit and fraud-context information. See Additional details for conditional requirements.
📘

Retry an uncertain create request safely

Azupay uses your clientId and clientTransactionId to identify a collection attempt. If you do not know whether a create request succeeded—for example, because your connection timed out—retry the same request without changing any fields.

Do not create a new clientTransactionId until you have confirmed that the original attempt was rejected. If an uncertain retry returns a validation or collection-limit error, stop and reconcile the original attempt with Azupay Support before creating another collection.

How agreement frequency limits Payment Initiations

You do not provide frequency or countPerPeriod when creating a Payment Initiation. Azupay reads these values from the associated Payment Agreement and checks each new collection against its authorised terms.

For frequency-based agreements:

  • countPerPeriod is the maximum number of Payment Initiations allowed during each agreement period.
  • Each period is measured from the agreement's startDate. For example, a monthly agreement follows monthly periods anchored to its start date rather than calendar months.
  • If countPerPeriod was not specified, the limit defaults to one Payment Initiation per period.
  • Payment Initiations count towards the limit unless their current status is FAILED. A failed attempt therefore does not consume the allowance when Azupay validates a later request.
  • ADHOC agreements are not subject to this per-period count check, although all other agreement conditions still apply.

If the limit has already been reached, Azupay rejects the request with HTTP 400 and failure code AZP5.18. A new Payment Initiation is not created. Review the agreement terms or wait until the next authorised period before creating another collection.

🚧

Catch-up payments from an earlier period

The standard Payment Initiation flow does not currently support catch-up payments for a collection missed in an earlier agreement period. Unused collection capacity from a previous period does not carry forward automatically.

If catch-up payments are important to your use case, submit a feature request through the Azupay Service Desk. This helps our team understand the requirement and consider it as part of future product discovery.

Additional details

If you include additionalDetails, provide customerNumber, userID, authMethod and channelType. The remaining fields are conditional or optional as shown below.

FieldRequiredType and formatDescription
customerNumberYesString, maximum 25 charactersYour identifier for the customer whose account is being debited.
userIDYesString, maximum 25 charactersYour identifier for the user who initiated the request.
authMethodYesEnumOne of 2FACTOR, OTP, BIOMETRIC, PASSWORD, PIN or NONE.
channelTypeYesEnumOne of BROWSER, MOBILE, BRANCH, IVR or OTHER.
ipAddressFor BROWSER or MOBILEStringThe originating device's IP address. Do not send it for other channel types.
deviceFingerprintFor BROWSER or MOBILEStringThe device or browser fingerprint. Do not send it for other channel types.
fraudScoreNoStringA fraud score calculated by your system. Omit this field if you do not have one.
notesNoString, maximum 2,048 charactersAdditional audit information.
geoLocationNoString, maximum 50 charactersLatitude and longitude from the originating device, separated by a comma—for example, -33.8708464,151.20732999999998. Only provide this field when GPS is enabled.

Step 2: Store the creation response

A successful request returns HTTP 201. Store PaymentInitiationStatus.paymentInitiationId; you need it to retrieve the latest status and reconcile webhook notifications.

The following example is abridged to highlight the fields used by the integration:

{
  "PaymentInitiation": {
    "clientId": "MYBUSINESSID",
    "clientTransactionId": "INV-0000001-1",
    "paymentAmount": "99.99",
    "paymentAgreementId": "86ea437729e81567218cd013aa5e3d36",
    "reference": "INVOICE-0000001",
    "description": "Monthly subscription payment",
    "paymentInitiationNotification": {
      "endpointURL": "https://merchant.example.com/webhooks/azupay",
      "authorizationHeader": "****"
    }
  },
  "PaymentInitiationStatus": {
    "paymentInitiationId": "a050551479f625c066b559da28fee33c",
    "nppTransactionId": "AZTPAU22XXXN20230419100000000000020",
    "status": "CREATED",
    "createdDatetime": "2026-10-07T00:00:00.000Z"
  },
  "PaymentAgreement": {
    "clientId": "MYBUSINESSID"
  }
}

The response also includes the Payment Agreement associated with the collection. The authorizationHeader value is never returned in plain text.

Step 3: Monitor the payment

Option A: Receive status webhooks

For a transaction-level callback, include paymentInitiationNotification in the create request. This configures the endpoint and authorization header for that Payment Initiation.

Azupay can also configure a reusable client-level webhook destination. Client-level destination URLs and authorization credentials are managed in your client configuration and cannot be added or changed through the dashboard. Contact Azupay Support if you need this option.

Azupay sends an HTTP POST request when an enabled Payment Initiation status event occurs.

📘

Enable Payment Initiation events

For the default transaction-level callback, your dashboard webhook preferences determine which status events Azupay sends. See Configure webhook preferences, then enable:

  • PaymentInitiation.PENDING for processing updates
  • PaymentInitiation.SETTLED for successful outcomes
  • PaymentInitiation.FAILED for unsuccessful outcomes

If you need updates about a later refund or automatic return, also enable PaymentInitiation.RETURN_IN_PROGRESS, PaymentInitiation.RETURN_COMPLETE and PaymentInitiation.RETURN_FAILED.

The initial CREATED status is returned by the create API. Do not rely on receiving a separate PaymentInitiation.CREATED webhook.

POST https://merchant.example.com/webhooks/azupay
Authorization: merchant-generated-secret
Content-Type: application/json

Unless Thin Payload is enabled for your client, the webhook contains the Payment Initiation and its latest status. The following example is abridged:

{
  "PaymentInitiation": {
    "clientId": "MYBUSINESSID",
    "clientTransactionId": "INV-0000001-1",
    "paymentAmount": "99.99",
    "paymentAgreementId": "86ea437729e81567218cd013aa5e3d36",
    "paymentInitiationNotification": {
      "endpointURL": "https://merchant.example.com/webhooks/azupay",
      "authorizationHeader": "****"
    }
  },
  "PaymentInitiationStatus": {
    "paymentInitiationId": "a050551479f625c066b559da28fee33c",
    "status": "SETTLED",
    "statusCode": "ACSC",
    "statusReason": "Accepted & Settled",
    "completedDatetime": "2026-10-07T00:01:30.000Z",
    "nppTransactionId": "AZTPAU22XXXN20230419100000000000020"
  }
}
📘

Full and thin webhook payloads

With the full payload, the webhook contains PaymentInitiation and PaymentInitiationStatus, as shown above.

If Thin Payload is enabled in the Azupay dashboard, the webhook contains only the Payment Initiation ID, its latest status and the time the record was updated:

{
  "PaymentInitiationStatus": {
    "paymentInitiationId": "a050551479f625c066b559da28fee33c",
    "status": "SETTLED"
  },
  "lastUpdatedTimestamp": "2026-10-07T00:01:30.000Z"
}

Use PaymentInitiationStatus.paymentInitiationId to correlate a thin notification. Retrieve the Payment Initiation through the Get Payment Initiation API if you need fields that are not included in the thin payload.

Your webhook endpoint must:

  1. Validate the HTTP Authorization header. For a transaction-level callback, compare it with the value supplied in paymentInitiationNotification. For a client-level destination, compare it with the authorization credentials configured by Azupay.
  2. Correlate the notification using PaymentInitiationStatus.paymentInitiationId. A full payload also includes PaymentInitiation.clientTransactionId.
  3. Process the notification idempotently because the same payload may be delivered more than once. For the original collection lifecycle, use paymentInitiationId and status together to recognise a repeated notification. For refunds, reconcile each attempt using refundInformation.requests[].nppTransactionId and refundInformation.requests[].status. Retrieve the Payment Initiation first if you receive a thin payload.
  4. Return HTTP 200 after the notification has been handled, including when it is a duplicate.
📘

Webhook delivery and security

For webhook configuration options, authentication, delivery retries, duplicate and out-of-order events, endpoint security and IP allowlisting, see Webhooks – Implementation and Security.

If a notification is delayed or unavailable, retrieve the latest status through the Get Payment Initiation API.

Option B: Retrieve the latest status

Use the ID returned by the create request:

GET https://api-uat.azupay.com.au/v1/paymentInitiation?id=a050551479f625c066b559da28fee33c
Authorization: SECR_MYBUSINESSID_myapikey

The response contains PaymentInitiation, PaymentInitiationStatus and the associated PaymentAgreement. The following example is abridged:

{
  "PaymentInitiation": {
    "clientId": "MYBUSINESSID",
    "clientTransactionId": "INV-0000001-1",
    "paymentAmount": "99.99",
    "paymentAgreementId": "86ea437729e81567218cd013aa5e3d36"
  },
  "PaymentInitiationStatus": {
    "paymentInitiationId": "a050551479f625c066b559da28fee33c",
    "status": "PENDING",
    "statusCode": "SENT",
    "statusReason": "Sent",
    "createdDatetime": "2026-10-07T00:00:00.000Z",
    "nppTransactionId": "AZTPAU22XXXN20230419100000000000020"
  },
  "PaymentAgreement": {
    "clientId": "MYBUSINESSID"
  }
}

Stop polling for the outcome of the original collection when status becomes SETTLED or FAILED.

If you need to track a later refund or the automatic return of late-arriving funds, keep the relevant RETURN_* webhook events enabled. When a return moves to RETURN_IN_PROGRESS, use webhook updates or retrieve the latest status until it reaches RETURN_COMPLETE or RETURN_FAILED.

The API does not prescribe a fixed polling interval. Use webhooks as the primary status channel where possible, and define a bounded reconciliation schedule that matches your operational needs. Avoid continuous or high-frequency requests, stop polling as soon as a final status is returned, and contact Azupay Support before implementing high-frequency polling.

Statuses

StatusCurrent operation complete?What it meansWhat your integration should do
CREATEDNoAzupay accepted the Payment Initiation and is waiting to process it.Store the ID and wait for another status. Do not submit another collection attempt.
PENDINGNoProcessing has started but no final outcome is available.Continue waiting for a webhook or retrieve the status later. Do not submit another collection attempt.
SETTLEDYesThe payment completed successfully.Mark the collection as successful.
FAILEDYesThe collection failed or did not reach a final network outcome within the processing window.Review statusCode and statusReason. If another attempt is appropriate, create a new Payment Initiation with a new clientTransactionId.
RETURN_IN_PROGRESSNoA refund or return has started and is still being processed.Wait for the return outcome.
RETURN_COMPLETEYesThe refund or return completed successfully.Reconcile the returned funds.
RETURN_FAILEDYesThe refund or return did not complete successfully.Review the outcome and contact Azupay Support if assistance is required.

In this table, Yes means that the current collection or return attempt has reached an outcome. It does not mean that the Payment Initiation can never change again. If a refundable balance remains, another eligible refund request can move a Payment Initiation from RETURN_COMPLETE or RETURN_FAILED back to RETURN_IN_PROGRESS.

🚧

Late-arriving funds after FAILED

Treat FAILED as the final outcome for the original collection attempt. Do not continue polling in expectation that the payment will later become successful.

In the rare event that settlement confirmation arrives after the Payment Initiation has entered FAILED, Azupay starts an automatic return. The status moves to RETURN_IN_PROGRESS, followed by RETURN_COMPLETE or RETURN_FAILED. The late-arriving funds do not increase your available balance.

Keep the PaymentInitiation.RETURN_IN_PROGRESS, PaymentInitiation.RETURN_COMPLETE and PaymentInitiation.RETURN_FAILED webhook events enabled if your integration needs to reconcile these later movements of funds.

RETURN_IN_PROGRESS, RETURN_COMPLETE and RETURN_FAILED describe subsequent movement of funds. They do not change the recorded outcome of the original collection attempt.

Status fields

FieldTypeWhen to use it
paymentInitiationIdStringAzupay's identifier for retrieving and correlating the Payment Initiation.
statusEnumThe primary lifecycle state. Use this field to decide whether processing is complete.
createdDatetimeISO 8601 date-time stringWhen the Payment Initiation was created.
completedDatetimeISO 8601 date-time stringWhen oringinal collection reached a completed state, when present.
statusCodeStringAdditional network processing information or a rejection code, when present.
statusReasonStringHuman-readable information corresponding to statusCode, when present.
nppTransactionIdStringThe transaction identifier assigned within the New Payments Platform (NPP).

Use status first. statusCode and statusReason provide supporting information and may be absent. A FAILED Payment Initiation does not always have a rejection code, and an intermediate code may remain present if processing later times out.

Refund a Payment Initiation

Use the Refund Payment Initiation API to return all or part of a collected payment to the customer. A merchant-requested refund is different from the automatic return of late-arriving funds described above, although both use the RETURN_* statuses.

You can request a refund when the Payment Initiation has one of these statuses:

  • SETTLED
  • RETURN_COMPLETE
  • RETURN_FAILED

You cannot request another refund while the status is RETURN_IN_PROGRESS. The Payment Initiation must have been created independently of a Payment Request, and your Azupay account must have enough available balance to process the refund.

Full refund

For a SETTLED Payment Initiation that has not already been partially refunded, provide the Payment Initiation ID and omit refundAmount:

POST https://api-uat.azupay.com.au/v1/paymentInitiation/refund?id=a050551479f625c066b559da28fee33c
Authorization: SECR_MYBUSINESSID_myapikey
Content-Type: application/json

Partial refund

To refund part of the payment, provide refundAmount. The amount cannot exceed PaymentInitiationStatus.refundInformation.availableBalance when that field is present.

The following request refunds $25.00:

POST https://api-uat.azupay.com.au/v1/paymentInitiation/refund?id=a050551479f625c066b559da28fee33c&refundAmount=25.00
Authorization: SECR_MYBUSINESSID_myapikey
Content-Type: application/json

Refund response and status

An accepted refund returns HTTP 200 and moves the Payment Initiation to RETURN_IN_PROGRESS. The response includes the remaining refundable balance and a record of each refund attempt:

{
  "PaymentInitiation": {
    "clientId": "MYBUSINESSID",
    "clientTransactionId": "INV-0000001-1",
    "paymentAmount": "100.00",
    "paymentAgreementId": "86ea437729e81567218cd013aa5e3d36"
  },
  "PaymentInitiationStatus": {
    "paymentInitiationId": "a050551479f625c066b559da28fee33c",
    "status": "RETURN_IN_PROGRESS",
    "refundInformation": {
      "availableBalance": "75.00",
      "requests": [
        {
          "createdDateTime": "2026-10-07T01:00:00.000Z",
          "nppTransactionId": "AZTPAU22XXXN20230419100000000000021",
          "status": "IN_PROGRESS",
          "amount": "25.00"
        }
      ]
    }
  }
}

Use refundInformation.requests to reconcile individual refund attempts:

FieldTypeDescription
availableBalanceString amountThe amount that remains available to refund.
requestsArrayThe refund attempts made against this Payment Initiation.
requests[].statusEnumIN_PROGRESS, COMPLETE or FAILED.
requests[].amountString amountThe amount of this refund attempt.
requests[].createdDateTimeISO 8601 date-time stringWhen the refund attempt was created.
requests[].completedDateTimeISO 8601 date-time stringWhen the refund attempt completed, when present.
requests[].nppTransactionIdStringThe NPP transaction identifier assigned to the refund.

When processing succeeds, the refund attempt moves to COMPLETE and the Payment Initiation moves to RETURN_COMPLETE. If processing fails, the attempt moves to FAILED, the Payment Initiation moves to RETURN_FAILED, and the failed amount becomes available to refund again.

Monitor refund status through the same Payment Initiation webhook and Get Payment Initiation API used for the original collection. If availableBalance is greater than zero after RETURN_COMPLETE, you can request another partial refund.

Refund errors

If a refund request is rejected with HTTP 400, the response uses details.failureCode = ERR0.03. Read details.failureReason for the specific cause. Common causes include:

  • the refund amount is invalid or exceeds the available refundable balance
  • another refund is already in progress
  • the Payment Initiation is not in an eligible status
  • the Payment Initiation is linked to a Payment Request and cannot be refunded through this API
  • your Azupay account has insufficient available balance

HTTP 404 is returned when the Payment Initiation or its associated Payment Agreement cannot be found.

A rejected refund request does not move the Payment Initiation to RETURN_FAILED. That status is used only when an accepted refund later fails during processing.

Handle errors and retries

Payment Initiation failures occur at two different stages. Handle them differently.

Failure stageWhere to find the detailsDid this request create a new Payment Initiation?Next action
The API rejects the requestHTTP response: details.failureCode and details.failureReasonNoCorrect the request and submit it again. If the original outcome is uncertain because of a timeout or lost response, reuse the same clientTransactionId.
Asynchronous payment processing failsPaymentInitiationStatus.status = FAILED, with optional statusCode and statusReasonYesTreat the existing attempt as final. If another collection is permitted, create a new Payment Initiation with a new clientTransactionId.
📘

A request-level error does not create a new FAILED Payment Initiation. A FAILED status is used only after a Payment Initiation has been created.

If you receive an error while retrying a request after a timeout or lost response, the earlier request may already have created the Payment Initiation. Continue using the same clientTransactionId and follow the uncertain-retry guidance above.

Request-level error example

Handle the HTTP response before interpreting any Payment Initiation status:

HTTP outcomeMeaningWhat to do
201 CreatedAzupay created or returned the Payment Initiation.Store the response and monitor PaymentInitiationStatus.status.
400 Bad RequestThis request was rejected and did not create a new Payment Initiation. An earlier request using the same clientTransactionId may still have succeeded if its outcome was uncertain.Read details.failureCode and details.failureReason. Correct and resubmit a definitively rejected request. For an uncertain retry, keep the same clientTransactionId and reconcile the original attempt before creating another collection.
401 UnauthorizedThe Authorization header is invalid.Check that the API key belongs to the environment and client ID being used. Do not retry unchanged credentials.
Connection timeout, lost response or another unexpected HTTP outcomeThe create outcome may be uncertain.Do not create a new collection identifier. Retry the same request with the same clientTransactionId. If the issue continues, stop automatic retries and contact Azupay Support.

403, 429 and 5xx responses are not defined outcomes for the Initiate a Payment operation in the published API contract. If one is received, handle it as an unexpected outcome rather than assuming that a Payment Initiation was or was not created.

Request errors are commonly returned with HTTP 400:

{
  "message": "The payment initiation limit has been reached for the current agreement period.",
  "details": {
    "failureCode": "AZP5.18",
    "failureReason": "The payment initiation limit has been reached for the current agreement period."
  }
}
failureCodeMeaning
AZP5.3Both deviceFingerprint and ipAddress are required when additionalDetails.channelType is BROWSER or MOBILE.
AZP5.4ipAddress is required when additionalDetails.channelType is BROWSER or MOBILE.
AZP5.5deviceFingerprint is required when additionalDetails.channelType is BROWSER or MOBILE.
AZP5.8The request body is invalid.
AZP5.18The Payment Initiation limit for the current agreement period has been reached.
AZP5.19The Payment Initiation could not be processed.
ERR0.03The request body, parameters or supplied values failed validation. Read failureReason for the specific issue.
ERR0.04The referenced Payment Agreement or Payment Request could not be found.

An ERR0.03 response can indicate that:

  • the Payment Agreement is not ACTIVE
  • the Payment Agreement has not started or has expired
  • a migrated direct debit arrangement is still within its five-day waiting period
  • the amount exceeds the agreement limit or outstanding balance
  • the request does not comply with a linked Payment Request
  • the supplied metadata does not meet the required format

Processing codes

These codes provide additional information while a Payment Initiation is being processed. They are not HTTP API errors.

Typical statusstatusCodeMeaning
PENDINGRECVThe payment instruction was received.
PENDINGUNDVThe payment instruction could not yet be delivered.
PENDINGSENTThe payment instruction was sent.
PENDINGSAFDThe instruction is being held for store-and-forward processing: the network has retained it for delivery when the receiving institution becomes available.
PENDINGACCPThe receiving institution accepted the instruction for clearing, the stage where participating institutions validate and exchange the payment instruction before settlement.
PENDINGACSPSettlement was aborted by the NPP Basic Infrastructure—the central infrastructure that processes NPP payments. Use status to determine whether processing is still active.
SETTLEDACSCThe payment was accepted and settled.

Common rejection codes

The following codes are commonly associated with a Payment Initiation that has entered FAILED.

Where the suggested response says to try again, the existing FAILED Payment Initiation remains final. Each retry is a separate collection attempt: create a new Payment Initiation with a new clientTransactionId and track its outcome separately.

Every new attempt is checked against the Payment Agreement as it exists at that time, including its status, validity dates, amount and applicable collection limits. Track retry counts and time windows in your integration, and stop when the individual code's limit is reached.

Some codes advise trying again later without defining a code-specific interval or attempt limit. Do not retry indefinitely. Apply a bounded retry policy defined for your integration, track every new attempt, and stop automated retries if the failure continues. Contact Azupay Support if you are unsure whether another collection attempt is permitted.

statusCodeMeaningSuggested response
AB01Clearing was aborted because of a timeout.If another collection is permitted, choose and document a retry interval for your integration. Create separate attempts for no longer than eight hours, then stop and treat the collection as failed.
AB02Clearing was aborted because of a fatal NPP error.If another collection is permitted, choose and document a retry interval for your integration. Create separate attempts for no longer than eight hours, then stop and treat the collection as failed.
AB03Settlement was aborted because of a timeout.If another collection is permitted, try again every 30 minutes for up to eight hours. Contact Azupay Support if the problem continues.
AB04Settlement was aborted because of a timeout.If another collection is permitted, try again every 30 minutes for up to eight hours. Contact Azupay Support if the problem continues.
AB08Settlement was aborted because of a timeout.If another collection is permitted, try again every 30 minutes for up to eight hours. Contact Azupay Support if the problem continues.
AC02The debtor account number is invalid or missing.Review the customer's account details before attempting another collection.
AC03The receiving account does not exist.Review the customer's account details before attempting another collection.
AC05The original debtor account is closed and the payment cannot be returned.Do not retry unchanged account details. Contact Azupay Support if you need help resolving the payment.
AC13This code is not expected when a valid PayTo agreement is in place.Contact Azupay Support.
AC15The payment requires further investigation.Contact Azupay Support.
AG01This code is not expected when a valid PayTo agreement is in place.Contact Azupay Support.
AG07The debtor account cannot be debited. This may indicate insufficient funds or another account restriction.If another collection is permitted, try again later.
AM01Zero-dollar payments are not supported.Correct the amount before creating another Payment Initiation.
AM02The transaction exceeds the applicable NPP or service amount limit.Reduce the amount or review the Payment Agreement before attempting another collection.
AM04The account has insufficient funds.If another collection is permitted, create a new Payment Initiation for each retry. Make no more than five retry attempts within 24 hours, tracking both the count and time window in your integration.
AM06The requested amount does not match the Payment Agreement.Correct the amount before creating another Payment Initiation.
AM09The requested amount does not match the Payment Agreement.Correct the amount before creating another Payment Initiation.
AM12The payment amount is missing. This will ordinarily be returned as a request-validation error.Add a valid amount before submitting the request again.
AM21The requested amount does not match the Payment Agreement.Correct the amount before creating another Payment Initiation.
BE06This code is not expected when a valid PayTo agreement is in place.Contact Azupay Support.
DT02A temporary error occurred.If another collection is permitted, try again later.
ED05Settlement failed.If another collection is permitted, create a new Payment Initiation for each retry. Make no more than five retry attempts within 24 hours, tracking both the count and time window in your integration.
ED06The interbank settlement system is unavailable.If another collection is permitted, try again later.
FF10A bank system error occurred.If another collection is permitted, try again later.
FF11A clearing-request error occurred.If another collection is permitted, try again later.
SL13The maximum number of transactions permitted by the Payment Agreement has been exceeded.Review the agreement before attempting another collection.
SL14The maximum amount permitted by the Payment Agreement has been exceeded.Review the agreement before attempting another collection.
E991A bank system error occurred.If another collection is permitted, try again later.
E992A bank system error occurred.If another collection is permitted, try again later.
M901A bank system error occurred.If another collection is permitted, try again later.
M902Online transactions are temporarily being rejected. Batch Payment Initiations are queued for delivery when the affected participant becomes available.Do not assume an online request will settle. Use its final status before deciding whether another attempt is appropriate.
M903Online transactions are temporarily being rejected. Batch Payment Initiations are queued for delivery when the affected participant becomes available.Do not assume an online request will settle. Use its final status before deciding whether another attempt is appropriate.
M904Online transactions are temporarily being rejected. Batch Payment Initiations are queued for delivery when the affected participant becomes available.Do not assume an online request will settle. Use its final status before deciding whether another attempt is appropriate.
M905A cancelled PayID should have cancelled the associated Payment Agreement.Review the agreement status and contact Azupay Support.
M914PayID porting is not currently available.Do not retry automatically.
M915PayID porting is not currently available.Do not retry automatically.
NAUTThe payment was not authorised.Review the Payment Agreement status. If it is ACTIVE, contact Azupay Support.
E999A fatal error occurred.Contact Azupay Support.
PA04There may be an NPP outage.If another collection is permitted, try again every 30 minutes for up to eight hours. Contact Azupay Support if the problem continues.

Search for Payment Initiations

Use the Payment Initiation Search API to find previously submitted collections. Date filters apply to the Payment Initiation's creation time—the time when the collection request was submitted—not its settlement or completion time.

Send a POST request to /v1/paymentInitiation/search:

POST https://api-uat.azupay.com.au/v1/paymentInitiation/search?numberOfRecords=100
Authorization: SECR_MYBUSINESSID_myapikey
Content-Type: application/json

Use only one search criterion in each request:

CriterionType and formatDescription
clientTransactionIdString, 5–100 charactersFinds the Payment Initiation created with your transaction identifier.
paymentAgreementIdString, 1–40 charactersFinds Payment Initiations associated with a Payment Agreement.
fromDate and toDateISO 8601 UTC date-time stringsFinds Payment Initiations created within the supplied range. Both fields are required, and fromDate must not be later than toDate.

Do not combine clientTransactionId, paymentAgreementId or a date range in the same request.

Search by client transaction ID

{
  "PaymentInitiationSearch": {
    "clientTransactionId": "INV-0000001-1"
  }
}

Search by creation date

{
  "PaymentInitiationSearch": {
    "fromDate": "2026-10-01T00:00:00.000Z",
    "toDate": "2026-10-31T23:59:59.999Z"
  }
}

Search response and pagination

The response contains recordCount and a records array. Each record contains PaymentInitiation, PaymentInitiationStatus and the associated PaymentAgreement snapshot.

{
  "recordCount": 1,
  "records": [
    {
      "PaymentInitiation": {
        "clientId": "MYBUSINESSID",
        "clientTransactionId": "INV-0000001-1",
        "paymentAmount": "99.99",
        "paymentAgreementId": "86ea437729e81567218cd013aa5e3d36"
      },
      "PaymentInitiationStatus": {
        "paymentInitiationId": "a050551479f625c066b559da28fee33c",
        "status": "SETTLED",
        "createdDatetime": "2026-10-07T00:00:00.000Z",
        "completedDatetime": "2026-10-07T00:01:30.000Z"
      },
      "PaymentAgreement": {
        "clientId": "MYBUSINESSID"
      }
    }
  ]
}

numberOfRecords is optional and defaults to 100. When the response includes nextPageId, repeat the same search and pass that value in the query string to retrieve the next page:

POST https://api-uat.azupay.com.au/v1/paymentInitiation/search?numberOfRecords=100&nextPageId={nextPageId}
Authorization: SECR_MYBUSINESSID_myapikey
Content-Type: application/json

Test your integration in UAT

Before moving to production, test successful collections, expected failures, refunds and status monitoring in UAT.

For the standard happy path, UAT automation:

  • approves Payment Agreements created using any PayID or BSB and account number
  • processes Payment Initiations created against those agreements and moves them to SETTLED

You do not need to use a specific PayID or bank account to test successful agreement approval and payment settlement.

Specific test inputs are configured for repeatable unhappy-path scenarios. Use these two guides when planning and running your tests:

For each asynchronous scenario, verify the outcome through the configured webhook, the Get Payment Initiation API, or both.

Implementation checklist

Before moving to production, confirm that your integration:

  • uses the correct base URL, client ID and API key for each environment
  • creates payments only against an ACTIVE Payment Agreement
  • validates that each amount complies with the agreement
  • assigns one unique clientTransactionId to each collection attempt
  • reuses that identifier only when retrying an uncertain create request
  • stores PaymentInitiationStatus.paymentInitiationId from the HTTP 201 response
  • treats CREATED and PENDING as non-final
  • treats SETTLED and FAILED as final for the original collection attempt
  • continues to reconcile later RETURN_* updates when refund or automatic-return tracking is required
  • supports the configured full or thin webhook payload
  • validates the webhook Authorization header against the value supplied for the transaction-level callback or the credentials configured by Azupay for a client-level destination
  • handles duplicate webhook deliveries safely
  • returns HTTP 200 for successfully handled webhook deliveries, including duplicates
  • can retrieve the latest status when a webhook is delayed or unavailable
  • creates a new Payment Initiation with a new clientTransactionId when retrying after FAILED
  • tracks retry counts and time windows for each collection
  • stops automated retries when the applicable code-specific limit is reached
  • applies a documented bounded retry policy when a code does not define a specific interval or attempt limit
  • checks refund eligibility and available balance before requesting a refund
  • tracks each refund using refundInformation.requests
  • follows nextPageId until all required Payment Initiation search results have been retrieved
  • completes the documented UAT success, failure, refund and status-monitoring scenarios

Support

Contact Azupay Support if:

  • a Payment Initiation remains unresolved longer than expected
  • an unexpected or fatal rejection code is returned
  • an agreement appears ACTIVE but the payment is reported as unauthorised
  • you are unsure whether another collection attempt is permitted under the Payment Agreement

Raise a request through the Azupay Service Desk.


Did this page help you?