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 paymentsYou 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
| API | Purpose | Method |
|---|---|---|
| Initiate a Payment | Creates a PayTo payment against an active Payment Agreement. | POST |
| Get a Payment Initiation | Retrieves the latest status using the Payment Initiation ID. | GET |
| Refund a Payment Initiation | Refunds all or part of an eligible Payment Initiation. | POST |
| Search for Payment Initiations | Finds 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
ACTIVEPayment Agreement; if you do not have one, see Create a Payment Agreement - an amount that complies with the Payment Agreement
- a unique
clientTransactionIdfor 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.
| Environment | Base URL |
|---|---|
| UAT | https://api-uat.azupay.com.au |
| Production | https://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
SETTLEDorFAILED. - 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 toFAILED.
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:
CREATEDandPENDINGare non-final states.SETTLEDis the successful outcome for the original collection.FAILEDis the unsuccessful outcome for the original collection.RETURN_IN_PROGRESS,RETURN_COMPLETEandRETURN_FAILEDdescribe 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
| Field | Required | Type and format | Description |
|---|---|---|---|
clientId | Yes | String, 5–50 characters | Your Azupay client ID for the environment being called. |
clientTransactionId | Yes | String, 5–100 characters | Your unique identifier for this collection attempt. Keep this value so you can safely retry an uncertain create request. |
paymentAmount | Yes | String containing an amount greater than zero with exactly two decimal places | The amount in AUD to collect. It must comply with the Payment Agreement. Zero-dollar payments are not supported. |
paymentAgreementId | Yes | String | The ID of the active Payment Agreement authorising the collection. |
reference | No | Printable ASCII string, 1–35 characters | An end-to-end transaction reference. It is passed through the payment message and appears on the payer's statement. |
description | No | String, 5–280 characters | Remittance information that describes the payment. |
paymentInitiationNotification | No | Object | Per-payment webhook configuration. Both nested fields are required when the object is included. |
paymentInitiationNotification.endpointURL | When the notification object is included | Public HTTPS URL | The endpoint Azupay calls when the Payment Initiation status changes. |
paymentInitiationNotification.authorizationHeader | When the notification object is included | String | The value Azupay sends in the webhook's HTTP Authorization header. It is masked as **** in API responses. |
metaData | No | Object containing up to 10 string fields | Merchant-defined metadata. Field names are limited to 40 ASCII characters and values to 255 ASCII characters. |
additionalDetails | No | Object | Audit and fraud-context information. See Additional details for conditional requirements. |
Retry an uncertain create request safelyAzupay uses your
clientIdandclientTransactionIdto 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
clientTransactionIduntil 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:
countPerPeriodis 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
countPerPeriodwas 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. ADHOCagreements 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 periodThe 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.
| Field | Required | Type and format | Description |
|---|---|---|---|
customerNumber | Yes | String, maximum 25 characters | Your identifier for the customer whose account is being debited. |
userID | Yes | String, maximum 25 characters | Your identifier for the user who initiated the request. |
authMethod | Yes | Enum | One of 2FACTOR, OTP, BIOMETRIC, PASSWORD, PIN or NONE. |
channelType | Yes | Enum | One of BROWSER, MOBILE, BRANCH, IVR or OTHER. |
ipAddress | For BROWSER or MOBILE | String | The originating device's IP address. Do not send it for other channel types. |
deviceFingerprint | For BROWSER or MOBILE | String | The device or browser fingerprint. Do not send it for other channel types. |
fraudScore | No | String | A fraud score calculated by your system. Omit this field if you do not have one. |
notes | No | String, maximum 2,048 characters | Additional audit information. |
geoLocation | No | String, maximum 50 characters | Latitude 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 eventsFor the default transaction-level callback, your dashboard webhook preferences determine which status events Azupay sends. See Configure webhook preferences, then enable:
PaymentInitiation.PENDINGfor processing updatesPaymentInitiation.SETTLEDfor successful outcomesPaymentInitiation.FAILEDfor unsuccessful outcomesIf you need updates about a later refund or automatic return, also enable
PaymentInitiation.RETURN_IN_PROGRESS,PaymentInitiation.RETURN_COMPLETEandPaymentInitiation.RETURN_FAILED.The initial
CREATEDstatus is returned by the create API. Do not rely on receiving a separatePaymentInitiation.CREATEDwebhook.
POST https://merchant.example.com/webhooks/azupay
Authorization: merchant-generated-secret
Content-Type: application/jsonUnless 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 payloadsWith the full payload, the webhook contains
PaymentInitiationandPaymentInitiationStatus, 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.paymentInitiationIdto 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:
- Validate the HTTP
Authorizationheader. For a transaction-level callback, compare it with the value supplied inpaymentInitiationNotification. For a client-level destination, compare it with the authorization credentials configured by Azupay. - Correlate the notification using
PaymentInitiationStatus.paymentInitiationId. A full payload also includesPaymentInitiation.clientTransactionId. - Process the notification idempotently because the same payload may be delivered more than once. For the original collection lifecycle, use
paymentInitiationIdandstatustogether to recognise a repeated notification. For refunds, reconcile each attempt usingrefundInformation.requests[].nppTransactionIdandrefundInformation.requests[].status. Retrieve the Payment Initiation first if you receive a thin payload. - Return HTTP
200after the notification has been handled, including when it is a duplicate.
Webhook delivery and securityFor 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_myapikeyThe 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
| Status | Current operation complete? | What it means | What your integration should do |
|---|---|---|---|
CREATED | No | Azupay accepted the Payment Initiation and is waiting to process it. | Store the ID and wait for another status. Do not submit another collection attempt. |
PENDING | No | Processing has started but no final outcome is available. | Continue waiting for a webhook or retrieve the status later. Do not submit another collection attempt. |
SETTLED | Yes | The payment completed successfully. | Mark the collection as successful. |
FAILED | Yes | The 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_PROGRESS | No | A refund or return has started and is still being processed. | Wait for the return outcome. |
RETURN_COMPLETE | Yes | The refund or return completed successfully. | Reconcile the returned funds. |
RETURN_FAILED | Yes | The 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 afterFAILEDTreat
FAILEDas 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 toRETURN_IN_PROGRESS, followed byRETURN_COMPLETEorRETURN_FAILED. The late-arriving funds do not increase your available balance.Keep the
PaymentInitiation.RETURN_IN_PROGRESS,PaymentInitiation.RETURN_COMPLETEandPaymentInitiation.RETURN_FAILEDwebhook 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
| Field | Type | When to use it |
|---|---|---|
paymentInitiationId | String | Azupay's identifier for retrieving and correlating the Payment Initiation. |
status | Enum | The primary lifecycle state. Use this field to decide whether processing is complete. |
createdDatetime | ISO 8601 date-time string | When the Payment Initiation was created. |
completedDatetime | ISO 8601 date-time string | When oringinal collection reached a completed state, when present. |
statusCode | String | Additional network processing information or a rejection code, when present. |
statusReason | String | Human-readable information corresponding to statusCode, when present. |
nppTransactionId | String | The 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:
SETTLEDRETURN_COMPLETERETURN_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/jsonPartial 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/jsonRefund 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:
| Field | Type | Description |
|---|---|---|
availableBalance | String amount | The amount that remains available to refund. |
requests | Array | The refund attempts made against this Payment Initiation. |
requests[].status | Enum | IN_PROGRESS, COMPLETE or FAILED. |
requests[].amount | String amount | The amount of this refund attempt. |
requests[].createdDateTime | ISO 8601 date-time string | When the refund attempt was created. |
requests[].completedDateTime | ISO 8601 date-time string | When the refund attempt completed, when present. |
requests[].nppTransactionId | String | The 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 stage | Where to find the details | Did this request create a new Payment Initiation? | Next action |
|---|---|---|---|
| The API rejects the request | HTTP response: details.failureCode and details.failureReason | No | Correct 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 fails | PaymentInitiationStatus.status = FAILED, with optional statusCode and statusReason | Yes | Treat 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
FAILEDPayment Initiation. AFAILEDstatus 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
clientTransactionIdand follow the uncertain-retry guidance above.
Request-level error example
Handle the HTTP response before interpreting any Payment Initiation status:
| HTTP outcome | Meaning | What to do |
|---|---|---|
201 Created | Azupay created or returned the Payment Initiation. | Store the response and monitor PaymentInitiationStatus.status. |
400 Bad Request | This 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 Unauthorized | The 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 outcome | The 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."
}
}failureCode | Meaning |
|---|---|
AZP5.3 | Both deviceFingerprint and ipAddress are required when additionalDetails.channelType is BROWSER or MOBILE. |
AZP5.4 | ipAddress is required when additionalDetails.channelType is BROWSER or MOBILE. |
AZP5.5 | deviceFingerprint is required when additionalDetails.channelType is BROWSER or MOBILE. |
AZP5.8 | The request body is invalid. |
AZP5.18 | The Payment Initiation limit for the current agreement period has been reached. |
AZP5.19 | The Payment Initiation could not be processed. |
ERR0.03 | The request body, parameters or supplied values failed validation. Read failureReason for the specific issue. |
ERR0.04 | The 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 status | statusCode | Meaning |
|---|---|---|
PENDING | RECV | The payment instruction was received. |
PENDING | UNDV | The payment instruction could not yet be delivered. |
PENDING | SENT | The payment instruction was sent. |
PENDING | SAFD | The instruction is being held for store-and-forward processing: the network has retained it for delivery when the receiving institution becomes available. |
PENDING | ACCP | The receiving institution accepted the instruction for clearing, the stage where participating institutions validate and exchange the payment instruction before settlement. |
PENDING | ACSP | Settlement was aborted by the NPP Basic Infrastructure—the central infrastructure that processes NPP payments. Use status to determine whether processing is still active. |
SETTLED | ACSC | The 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.
statusCode | Meaning | Suggested response |
|---|---|---|
AB01 | Clearing 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. |
AB02 | Clearing 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. |
AB03 | Settlement 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. |
AB04 | Settlement 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. |
AB08 | Settlement 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. |
AC02 | The debtor account number is invalid or missing. | Review the customer's account details before attempting another collection. |
AC03 | The receiving account does not exist. | Review the customer's account details before attempting another collection. |
AC05 | The 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. |
AC13 | This code is not expected when a valid PayTo agreement is in place. | Contact Azupay Support. |
AC15 | The payment requires further investigation. | Contact Azupay Support. |
AG01 | This code is not expected when a valid PayTo agreement is in place. | Contact Azupay Support. |
AG07 | The debtor account cannot be debited. This may indicate insufficient funds or another account restriction. | If another collection is permitted, try again later. |
AM01 | Zero-dollar payments are not supported. | Correct the amount before creating another Payment Initiation. |
AM02 | The transaction exceeds the applicable NPP or service amount limit. | Reduce the amount or review the Payment Agreement before attempting another collection. |
AM04 | The 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. |
AM06 | The requested amount does not match the Payment Agreement. | Correct the amount before creating another Payment Initiation. |
AM09 | The requested amount does not match the Payment Agreement. | Correct the amount before creating another Payment Initiation. |
AM12 | The payment amount is missing. This will ordinarily be returned as a request-validation error. | Add a valid amount before submitting the request again. |
AM21 | The requested amount does not match the Payment Agreement. | Correct the amount before creating another Payment Initiation. |
BE06 | This code is not expected when a valid PayTo agreement is in place. | Contact Azupay Support. |
DT02 | A temporary error occurred. | If another collection is permitted, try again later. |
ED05 | Settlement 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. |
ED06 | The interbank settlement system is unavailable. | If another collection is permitted, try again later. |
FF10 | A bank system error occurred. | If another collection is permitted, try again later. |
FF11 | A clearing-request error occurred. | If another collection is permitted, try again later. |
SL13 | The maximum number of transactions permitted by the Payment Agreement has been exceeded. | Review the agreement before attempting another collection. |
SL14 | The maximum amount permitted by the Payment Agreement has been exceeded. | Review the agreement before attempting another collection. |
E991 | A bank system error occurred. | If another collection is permitted, try again later. |
E992 | A bank system error occurred. | If another collection is permitted, try again later. |
M901 | A bank system error occurred. | If another collection is permitted, try again later. |
M902 | Online 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. |
M903 | Online 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. |
M904 | Online 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. |
M905 | A cancelled PayID should have cancelled the associated Payment Agreement. | Review the agreement status and contact Azupay Support. |
M914 | PayID porting is not currently available. | Do not retry automatically. |
M915 | PayID porting is not currently available. | Do not retry automatically. |
NAUT | The payment was not authorised. | Review the Payment Agreement status. If it is ACTIVE, contact Azupay Support. |
E999 | A fatal error occurred. | Contact Azupay Support. |
PA04 | There 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/jsonUse only one search criterion in each request:
| Criterion | Type and format | Description |
|---|---|---|
clientTransactionId | String, 5–100 characters | Finds the Payment Initiation created with your transaction identifier. |
paymentAgreementId | String, 1–40 characters | Finds Payment Initiations associated with a Payment Agreement. |
fromDate and toDate | ISO 8601 UTC date-time strings | Finds 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/jsonTest 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:
- Payment Initiation testing guide — follow the end-to-end procedure for collections, request validation, refunds and status monitoring.
- Payment Initiation test accounts — use the configured inputs for specific failure outcomes and rejection codes.
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
ACTIVEPayment Agreement - validates that each amount complies with the agreement
- assigns one unique
clientTransactionIdto each collection attempt - reuses that identifier only when retrying an uncertain create request
- stores
PaymentInitiationStatus.paymentInitiationIdfrom the HTTP201response - treats
CREATEDandPENDINGas non-final - treats
SETTLEDandFAILEDas 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
Authorizationheader 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
200for 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
clientTransactionIdwhen retrying afterFAILED - 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
nextPageIduntil 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
ACTIVEbut 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.
Updated 12 days ago
