Skip to content
API DocsDocs

APM Response Data Examples

Concrete apmResponseData examples for every APM action type

5 min readUpdated Mar 26, 2026

APM Response Data Examples

When you receive a response from POST /api/v1/payments/apm or a webhook callback with paymentMethod=apm, the apmResponseData object varies by payment method and action type. This page provides concrete JSON examples for each category.

#ApmResponseData Schema (quick reference table)

FieldTypeDescription
paymentMethodEnumPayment method identifier (e.g., PIX_QR, PAYPAL, IDEAL)
paymentTypeEnumCategory: E_WALLET, BANK_TRANSFER, CARD_PAYMENT
actionTypeEnumREDIRECTION, QR, or NONE
redirectUrlString?Full-page redirect URL
iframeUrlString?Embeddable iframe URL
qrDataString?Base64-encoded QR code image
qrDeepLinkString?Mobile deep link for QR payment apps
providerTransactionIdString?Transaction ID in provider's system
extraMap?Additional key-value metadata

#Redirect-Based APMs (actionType: REDIRECTION)

Customer completes payment on provider's hosted page.

#E-Wallet Redirect (e.g., PayPal, Skrill, Neteller)

{
  "requestId": "req-wallet-001",
  "transactionId": "tx-88001122",
  "transactionStatus": "CUSTOMER_VERIFICATION",
  "apmResponseData": {
    "paymentMethod": "PAYPAL",
    "paymentType": "E_WALLET",
    "actionType": "REDIRECTION",
    "redirectUrl": "https://www.paypal.com/checkoutnow?token=EC-1AB23456CD789012E",
    "iframeUrl": null,
    "qrData": null,
    "qrDeepLink": null,
    "providerTransactionId": "EC-1AB23456CD789012E",
    "extra": null
  },
  "createdTime": "2025-07-29T10:00:00Z"
}

Action: redirect user to redirectUrl. After completion, user returns to your successRedirectUrl/failureRedirectUrl. Final status arrives via webhook.

#Bank Transfer Redirect (e.g., iDEAL, SEPA, Sofort)

{
  "requestId": "req-bank-001",
  "transactionId": "tx-88002233",
  "transactionStatus": "CUSTOMER_VERIFICATION",
  "apmResponseData": {
    "paymentMethod": "IDEAL",
    "paymentType": "BANK_TRANSFER",
    "actionType": "REDIRECTION",
    "redirectUrl": "https://ideal.bunq.com/authorize?trxid=0050004012345678",
    "iframeUrl": null,
    "qrData": null,
    "qrDeepLink": null,
    "providerTransactionId": "0050004012345678",
    "extra": null
  },
  "createdTime": "2025-07-29T10:05:00Z"
}

#HPP Apple Pay (EXTERNAL_HPP_APPLE_PAY)

{
  "requestId": "req-apple-001",
  "transactionId": "tx-88003344",
  "transactionStatus": "CUSTOMER_VERIFICATION",
  "apmResponseData": {
    "paymentMethod": "EXTERNAL_HPP_APPLE_PAY",
    "paymentType": "E_WALLET",
    "actionType": "REDIRECTION",
    "redirectUrl": "https://hpp.provider.com/checkout/apple/abc123",
    "iframeUrl": "https://hpp.provider.com/iframe/apple/abc123",
    "qrData": null,
    "qrDeepLink": null,
    "providerTransactionId": "prov-ap-abc123",
    "extra": {
      "walletType": "APPLE_PAY"
    }
  },
  "createdTime": "2025-07-29T10:10:00Z"
}

Note: when both redirectUrl and iframeUrl are present, choose whichever fits your checkout UX.

#HPP Google Pay (EXTERNAL_HPP_GOOGLE_PAY)

{
  "requestId": "req-google-001",
  "transactionId": "tx-88004455",
  "transactionStatus": "CUSTOMER_VERIFICATION",
  "apmResponseData": {
    "paymentMethod": "EXTERNAL_HPP_GOOGLE_PAY",
    "paymentType": "E_WALLET",
    "actionType": "REDIRECTION",
    "redirectUrl": "https://hpp.provider.com/checkout/google/def456",
    "iframeUrl": "https://hpp.provider.com/iframe/google/def456",
    "qrData": null,
    "qrDeepLink": null,
    "providerTransactionId": "prov-gp-def456",
    "extra": {
      "walletType": "GOOGLE_PAY"
    }
  },
  "createdTime": "2025-07-29T10:15:00Z"
}

#HPP BLIK (EXTERNAL_HPP_BLIK)

{
  "requestId": "req-blik-001",
  "transactionId": "tx-88005566",
  "transactionStatus": "CUSTOMER_VERIFICATION",
  "apmResponseData": {
    "paymentMethod": "EXTERNAL_HPP_BLIK",
    "paymentType": "BANK_TRANSFER",
    "actionType": "REDIRECTION",
    "redirectUrl": "https://hpp.provider.com/checkout/blik/ghi789",
    "iframeUrl": null,
    "qrData": null,
    "qrDeepLink": null,
    "providerTransactionId": "prov-blik-ghi789",
    "extra": null
  },
  "createdTime": "2025-07-29T10:20:00Z"
}

#HPP EFT (EXTERNAL_HPP_EFT)

{
  "requestId": "req-eft-001",
  "transactionId": "tx-88006677",
  "transactionStatus": "CUSTOMER_VERIFICATION",
  "apmResponseData": {
    "paymentMethod": "EXTERNAL_HPP_EFT",
    "paymentType": "BANK_TRANSFER",
    "actionType": "REDIRECTION",
    "redirectUrl": "https://hpp.provider.com/checkout/eft/jkl012",
    "iframeUrl": null,
    "qrData": null,
    "qrDeepLink": null,
    "providerTransactionId": "prov-eft-jkl012",
    "extra": null
  },
  "createdTime": "2025-07-29T10:25:00Z"
}

#QR-Based APMs (actionType: QR)

Customer scans a QR code or uses a mobile deep link.

#PIX QR

{
  "requestId": "req-pix-001",
  "transactionId": "tx-99001122",
  "transactionStatus": "CUSTOMER_VERIFICATION",
  "apmResponseData": {
    "paymentMethod": "PIX_QR",
    "paymentType": "E_WALLET",
    "actionType": "QR",
    "redirectUrl": null,
    "iframeUrl": null,
    "qrData": "iVBORw0KGgoAAAANSUhEUg...base64-encoded-png...",
    "qrDeepLink": "pix://pay?code=BR123456789ABCDEF",
    "providerTransactionId": "pix-tx-abc123",
    "extra": null
  },
  "createdTime": "2025-07-29T11:00:00Z"
}

Action:

  1. Decode qrData (Base64 to PNG) and display to customer
  2. On mobile, offer qrDeepLink as a tap-to-pay button
  3. Poll GET /api/v1/payments/apm/status/{transactionId} or wait for webhook

#UPI QR

{
  "requestId": "req-upi-001",
  "transactionId": "tx-99002233",
  "transactionStatus": "CUSTOMER_VERIFICATION",
  "apmResponseData": {
    "paymentMethod": "UPI_QR",
    "paymentType": "E_WALLET",
    "actionType": "QR",
    "redirectUrl": null,
    "iframeUrl": null,
    "qrData": "iVBORw0KGgoAAAANSUhEUg...base64-encoded-png...",
    "qrDeepLink": "upi://pay?pa=merchant@upi&pn=Merchant&am=500.00&cu=INR",
    "providerTransactionId": "upi-tx-def456",
    "extra": null
  },
  "createdTime": "2025-07-29T11:05:00Z"
}

#AstroPay QR

{
  "requestId": "req-astro-001",
  "transactionId": "tx-99003344",
  "transactionStatus": "CUSTOMER_VERIFICATION",
  "apmResponseData": {
    "paymentMethod": "ASTRO_PAY_QR",
    "paymentType": "E_WALLET",
    "actionType": "QR",
    "redirectUrl": null,
    "iframeUrl": null,
    "qrData": "iVBORw0KGgoAAAANSUhEUg...base64-encoded-png...",
    "qrDeepLink": null,
    "providerTransactionId": "astro-tx-ghi789",
    "extra": null
  },
  "createdTime": "2025-07-29T11:10:00Z"
}

Note: AstroPay may not return qrDeepLink. Always check for null.


#No Action Required (actionType: NONE)

Payment finalized server-side, no customer interaction needed.

{
  "requestId": "req-none-001",
  "transactionId": "tx-77001122",
  "transactionStatus": "SUCCEED",
  "apmResponseData": {
    "paymentMethod": "SMART_E_WALLET",
    "paymentType": "E_WALLET",
    "actionType": "NONE",
    "redirectUrl": null,
    "iframeUrl": null,
    "qrData": null,
    "qrDeepLink": null,
    "providerTransactionId": "prov-none-xyz789",
    "extra": null
  },
  "createdTime": "2025-07-29T12:00:00Z"
}

#Handling Logic (Decision Tree)

Receive response from POST /api/v1/payments/apm
  |
  +-- transactionStatus = "SUCCEED" or "FAILED"
  |   +-- Payment is final. No further action needed.
  |
  +-- transactionStatus = "CUSTOMER_VERIFICATION"
      |
      +-- actionType = "REDIRECTION"
      |   +-- redirectUrl present -> Full-page redirect
      |   +-- iframeUrl present -> Embed in iframe
      |   +-- Both present -> Choose based on your UX
      |
      +-- actionType = "QR"
      |   +-- qrData present -> Decode Base64 -> Display QR image
      |   +-- qrDeepLink present -> Show as tap-to-pay on mobile
      |   +-- Poll status or wait for webhook callback
      |
      +-- actionType = "NONE"
          +-- Wait for webhook callback or poll status endpoint

#Common Patterns

#Rendering QR Codes

// Display QR image from Base64
const img = document.createElement('img');
img.src = `data:image/png;base64,${apmResponseData.qrData}`;
document.getElementById('qr-container').appendChild(img);
 
// Deep link fallback for mobile
if (apmResponseData.qrDeepLink) {
  const link = document.createElement('a');
  link.href = apmResponseData.qrDeepLink;
  link.textContent = 'Open in app';
  document.getElementById('qr-container').appendChild(link);
}

#Redirect with Fallback

const { redirectUrl, iframeUrl } = apmResponseData;
 
if (iframeUrl && !isMobile()) {
  // Embed iframe for desktop
  const iframe = document.createElement('iframe');
  iframe.src = iframeUrl;
  iframe.width = '100%';
  iframe.height = '600';
  document.getElementById('payment-container').appendChild(iframe);
} else if (redirectUrl) {
  // Full redirect
  window.location.href = redirectUrl;
}

#See Also

Was this helpful?