Skip to content
API DocsDocs

PayID Payment Payload

Request and reference response payloads for Australian PayID payments.

7 min readUpdated Oct 13, 2026

Payment Method Identifier: PAY_ID | Payment Type: BANK_TRANSFER

PayID is an Australian bank-transfer method. It is available for AUD payments through POST /api/v1/payments/apm: the customer receives bank details and a payment reference and transfers the money from their banking app.

A payment may require identity verification before it continues. The data PayID asks for is listed on PayID Identity Verification; the flow itself is on Identity Verification.

#Request Payload

#Request Fields

Top-Level Fields

FieldTypeRequiredDescription
callbackUrlStringNoServer-to-server webhook URL for the final transaction result
successRedirectUrlStringNoURL the customer returns to after completing the hosted step of the internal redirect flow
failureRedirectUrlStringNoURL the customer returns to after a failed or abandoned hosted step

Billing Details (ApmBillingDetails)

FieldTypeRequiredDescription
emailStringYesRequired for every APM payment. Also serves as the customer identifier at the provider when externalUserId is blank.
externalUserIdStringNoThe customer identifier at the provider, used in preference to the email. Send the same value for every payment and payout of a customer — the provider keeps the verification status under this identifier, and a changed identifier is treated as a new customer.
dateOfBirthStringConditionalCustomer date of birth, YYYY-MM-DD. Required on the customer's first PayID payment; the customer must be 18 or older. Not used on later payments.

Payload Fields (apmPayload)

FieldTypeRequiredDescription
paymentMethodEnumYesMust be PAY_ID
paymentTypeEnumYesMust be BANK_TRANSFER
accountHolderNameStringYesFull name on the bank account the customer pays from. Sent to the provider as is.
emailStringNoExtra customer email passed to the provider. A non-blank billingDetails.email takes precedence; this value is used when billing has none. It does not stand in for the customer identifier.
dateOfBirthStringNoCustomer date of birth, YYYY-MM-DD. Takes precedence over billingDetails.dateOfBirth; billing is used when this value is blank.

The billing first and last name are not sent to the provider.

The first PayID payment of a customer opens the customer's account at the provider and needs the customer's name and date of birth: the name comes from accountHolderName, the date of birth from apmPayload.dateOfBirth or, when it is blank, billingDetails.dateOfBirth. A first payment with a date in another format, or for a customer under 18, is declined with 62 and the reason in the response. A first payment without a date of birth is declined the same way, unless missing fields are collected on Exirom's page for your account: then it returns the internal redirect response and the customer enters the date of birth there. A payment counts as the first one until the customer has a successful PayID payment under the same externalUserId (or the same email when externalUserId is blank).

{
  "paymentMethod": "PAY_ID",
  "paymentType": "BANK_TRANSFER",
  "accountHolderName": "Alex Example",
  "email": "alex@example.com"
}

#Direct Response

An accepted payment returns transactionStatus: PROCESSING with actionType: REFERENCE. Show the customer the bank details, the payment reference, the order amount and currency, and customerInstructionsByLanguage. The customer must enter the reference exactly as shown so the provider can match the transfer.

{
  "requestId": "00000000-0000-4000-8000-000000000001",
  "transactionId": "123456789",
  "transactionStatus": "PROCESSING",
  "paymentType": "APM",
  "apmResponseData": {
    "paymentMethod": "PAY_ID",
    "paymentType": "BANK_TRANSFER",
    "actionType": "REFERENCE",
    "providerTransactionId": "payment-1",
    "references": [
      { "key": "bankName", "label": "Bank", "value": "Example Bank" },
      { "key": "accountHolder", "label": "Account holder", "value": "Example Holder" },
      { "key": "accountNumber", "label": "Account number", "value": "00123456" },
      { "key": "payidReference", "label": "Payment reference", "value": "A4K9PX" }
    ],
    "customerInstructionsByLanguage": {
      "en": "## How to pay\n\n1. Open your banking app and create a new transfer to the account shown.\n2. Enter the displayed amount in AUD.\n3. Enter the payment reference exactly as shown in the transfer description.\n4. Confirm the transfer.\n\nYou will be redirected back to the merchant as soon as we receive your payment."
    }
  }
}

#Response Fields

FieldTypeDescription
paymentMethodEnumAlways PAY_ID
paymentTypeEnumAlways BANK_TRANSFER
actionTypeEnumREFERENCE when the transfer details are ready
providerTransactionIdStringProvider transaction identifier, when available
referencesArrayTransfer details; the keys are listed below
customerInstructionsByLanguageObjectMarkdown instructions keyed by language: en (English), es (Spanish), pt (Portuguese)
Reference keyMeaning
bankNameBank of the receiving account
accountHolderName of the receiving account
accountNumberReceiving account number
payidReferencePayment reference the customer must enter in the transfer description

references has no amount entry; display the order amount. Show the instructions for the selected language, falling back to English.

Receiving the bank details is not a successful payment. The payment becomes SUCCEED when the provider confirms the transfer; use the callback or payment info for the final result. If the provider confirms a different amount than requested, processedAmount carries the confirmed amount and orderAmount stays unchanged.

When the provider has no receiving account available for the moment, the payment is declined with 81 (GATEWAY_LIMIT_EXCEEDED). A later payment may succeed.

A payment that is declined before the transfer details exist returns actionType: NONE with transactionStatus: FAILED and a decline code, and carries no references.

#Verification Response

When the customer must be verified before the payment continues, the response is transactionStatus: CUSTOMER_VERIFICATION with actionType: KYC_REQUIRED and an iframeUrl holding the hosted verification form. Collect the identity data with that form or with your own, and submit it to the KYC endpoint; the payment then continues and returns one of the responses above. See Identity Verification.

{
  "requestId": "00000000-0000-4000-8000-000000000001",
  "transactionId": "123456789",
  "transactionStatus": "CUSTOMER_VERIFICATION",
  "paymentType": "APM",
  "apmResponseData": {
    "paymentMethod": "PAY_ID",
    "paymentType": "BANK_TRANSFER",
    "actionType": "KYC_REQUIRED",
    "iframeUrl": "https://...",
    "customerInstructionsByLanguage": {
      "en": "Identity verification is required to continue this payment. Complete the form and submit your identity document."
    }
  }
}

#Verification Response Fields

FieldTypeDescription
paymentMethodEnumAlways PAY_ID
paymentTypeEnumAlways BANK_TRANSFER
actionTypeEnumKYC_REQUIRED while the payment waits for the customer's identity data
iframeUrlStringThe hosted verification form, to embed in an iframe
providerTransactionIdStringProvider transaction identifier, when available
customerInstructionsByLanguageObjectMarkdown instructions keyed by language

#Internal Redirect Response

If you cannot send accountHolderName, omit it and use the internal APM redirect flow. The initial response has actionType: REDIRECTION; redirect the customer to redirectUrl to continue the same transaction. The customer enters the missing fields on Exirom's page — on the first payment also the date of birth — and fields you already sent are not asked again.

{
  "paymentMethod": "PAY_ID",
  "paymentType": "BANK_TRANSFER",
  "actionType": "REDIRECTION",
  "redirectUrl": "https://checkout.example.com/?token=..."
}

#See Also

Was this helpful?