PayID Payment Payload
Request and reference response payloads for Australian PayID payments.
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
| Field | Type | Required | Description |
|---|---|---|---|
callbackUrl | String | No | Server-to-server webhook URL for the final transaction result |
successRedirectUrl | String | No | URL the customer returns to after completing the hosted step of the internal redirect flow |
failureRedirectUrl | String | No | URL the customer returns to after a failed or abandoned hosted step |
Billing Details (ApmBillingDetails)
| Field | Type | Required | Description |
|---|---|---|---|
email | String | Yes | Required for every APM payment. Also serves as the customer identifier at the provider when externalUserId is blank. |
externalUserId | String | No | The 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. |
dateOfBirth | String | Conditional | Customer 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)
| Field | Type | Required | Description |
|---|---|---|---|
paymentMethod | Enum | Yes | Must be PAY_ID |
paymentType | Enum | Yes | Must be BANK_TRANSFER |
accountHolderName | String | Yes | Full name on the bank account the customer pays from. Sent to the provider as is. |
email | String | No | Extra 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. |
dateOfBirth | String | No | Customer 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
| Field | Type | Description |
|---|---|---|
paymentMethod | Enum | Always PAY_ID |
paymentType | Enum | Always BANK_TRANSFER |
actionType | Enum | REFERENCE when the transfer details are ready |
providerTransactionId | String | Provider transaction identifier, when available |
references | Array | Transfer details; the keys are listed below |
customerInstructionsByLanguage | Object | Markdown instructions keyed by language: en (English), es (Spanish), pt (Portuguese) |
| Reference key | Meaning |
|---|---|
bankName | Bank of the receiving account |
accountHolder | Name of the receiving account |
accountNumber | Receiving account number |
payidReference | Payment 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
| Field | Type | Description |
|---|---|---|
paymentMethod | Enum | Always PAY_ID |
paymentType | Enum | Always BANK_TRANSFER |
actionType | Enum | KYC_REQUIRED while the payment waits for the customer's identity data |
iframeUrl | String | The hosted verification form, to embed in an iframe |
providerTransactionId | String | Provider transaction identifier, when available |
customerInstructionsByLanguage | Object | Markdown 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
- APM Payment API — Full request and response schema
- Payment Flow — End-to-end payment handling
- PayID Payout Payload — PayID payout fields
- PayID Identity Verification — The identity data PayID requires