Skip to main content
Out-of-Band (OOB) authentication provides an extra layer of security for online card transactions by requiring cardholder verification through a separate channel. The Issuing API provides webhook-based OOB integration that allows you to build seamless, in-app approval experiences while maintaining security and compliance.

Overview

When a cardholder performs an online transaction that requires OOB verification, UTGL generates a secure, time-sensitive approval URL. This URL is delivered to your webhook endpoint, allowing you to present it to the cardholder within your application. After the cardholder completes the verification, a terminal webhook event communicates the final outcome.

Key Benefits

  • Enhanced Security - Reduces fraud and chargebacks through cardholder verification
  • Regulatory Compliance - Meets Strong Customer Authentication (SCA) requirements
  • Seamless UX - In-app approval flow keeps users within your application
  • Real-time Updates - Webhook events provide immediate status notifications

How OOB Works

The OOB (Out-of-Band) flow involves multiple parties working together to verify the transaction:

Transaction Lifecycle

  1. Transaction Initiation - Cardholder initiates an online payment
  2. OOB Detection - UTGL system determines if OOB verification is required
  3. Challenge Initiated - Approval URL generated and sent via webhook
  4. User Verification - Cardholder reviews and approves/declines on secure page
  5. Completion - Terminal webhook sent with final outcome

Webhook Events

The OOB integration uses four webhook events to manage the complete transaction lifecycle:

Integration Guide

Prerequisites

Before integrating OOB, ensure you have:
  1. Webhook endpoint configured - Secure HTTPS endpoint to receive events
  2. Webhook signature verification - Validate incoming webhook requests
  3. Event processing system - Handle webhook events reliably
  4. User interface - Way to present approval URL to cardholders
See Webhooks Overview for webhook setup instructions.

Step 1: Handle Challenge Initiated Event

When a transaction requires OOB verification, you’ll receive a challenge.initiated webhook event.

Event Structure

Event Data Fields

Webhook Handler Example

Time Sensitivity: The approval URL expires after 5 minutes. Present it to the cardholder immediately upon receiving the webhook. If the URL expires, the transaction will fail and you’ll receive a challenge.failed event.

Step 2: Present Approval URL to Cardholder

Upon receiving the challenge.initiated event, you must present the approval URL to the cardholder. The URL must be opened in a secure context where the cardholder can review transaction details and make a decision.
Security Requirement: The approval or rejection must be performed by the cardholder on the page hosted at the provided URL. Your application must not attempt to replicate the approval UI or process the decision programmatically. The URL contains a one-time-use token and is the sole method for completing verification.

Mobile Application Integration

Recommended: Embedded Web View For the best user experience, load the approval URL within an embedded web view rather than redirecting to an external browser. This keeps users within your application context. iOS Example (SwiftUI):
Android Example (Kotlin):

Web Application Integration

For web applications, you can use an iframe or modal overlay:

postMessage API

The approval page uses window.postMessage() to notify your application when the approval process completes. This allows automatic web view closure and seamless user experience. Message Structure:
Status Values:
  • succeeded - Cardholder approved the transaction
  • declined - Cardholder declined the transaction
  • failed - Challenge expired or system error occurred
JavaScript Listener:

Step 3: Handle Challenge Resolution Events

After a challenge is initiated, the system will send exactly one terminal webhook event indicating the final outcome. Your system must handle all three possible outcomes.

Challenge Succeeded

Sent when the cardholder successfully approves the transaction. Event:
Action: Proceed with transaction completion. The transaction has been verified and authorized.

Challenge Declined

Sent when the cardholder actively declines the transaction. Event:
Action: Cancel the transaction. Inform the cardholder that the transaction was declined.

Challenge Failed

Sent when the challenge expires or fails due to a system error. Event:
Failure Reasons: Action: Inform the cardholder and provide option to retry the transaction.

Complete Webhook Handler


Best Practices

Security

  1. Verify Webhook Signatures - Always validate incoming webhook requests using the signature header
  2. HTTPS Only - Use HTTPS for all webhook endpoints
  3. Origin Verification - When listening for postMessage, always verify the origin is https://approve.utgl.io
  4. Time-Sensitive URLs - Present approval URLs immediately; they expire in 5 minutes

User Experience

  1. Embedded Web Views - Use embedded web views instead of external browser redirects
  2. Loading States - Show loading indicators while waiting for approval
  3. Error Handling - Provide clear error messages and retry options
  4. Automatic Closure - Use postMessage to automatically close web views after completion

Reliability

  1. Idempotency - Use event id field to prevent duplicate processing
  2. Event Logging - Log all webhook events for debugging and audit trails
  3. Retry Logic - Implement retry logic for failed webhook deliveries
  4. Status Tracking - Track challenge state to handle edge cases

Performance

  1. Immediate Presentation - Present approval URL as soon as webhook is received
  2. Async Processing - Process webhooks asynchronously to respond quickly
  3. Connection Pooling - Reuse HTTP connections for webhook processing

Challenge Lifecycle States

Understanding the challenge lifecycle helps you handle edge cases: State Transitions:
  • InitiatedSucceeded: Cardholder approves within timeout window
  • InitiatedDeclined: Cardholder actively declines
  • InitiatedFailed: 5-minute timeout expires or system error occurs
One Terminal Event: Each challenge will result in exactly one terminal event (succeeded, declined, or failed). Your system should handle all three outcomes.

Troubleshooting

Common Issues

Debugging Tips

  1. Log All Events - Log incoming webhook events with timestamps and event IDs
  2. Track Challenge State - Maintain state mapping between cardAccountId and challenge status
  3. Monitor Expiration - Track expiresAt timestamps to identify timing issues
  4. Test Webhook Delivery - Use webhook testing tools to verify endpoint accessibility

Testing

Test Mode

In sandbox/test mode, you can test the OOB flow:
  1. Initiate Test Transaction - Create a transaction that triggers OOB verification
  2. Receive Webhook - Verify challenge.initiated webhook is received
  3. Present URL - Load approval URL in test environment
  4. Complete Challenge - Approve or decline to test different outcomes
  5. Verify Terminal Event - Confirm terminal webhook is received

Test Scenarios

  • Successful Approval - Complete approval flow and verify challenge.succeeded event
  • User Decline - Decline transaction and verify challenge.declined event
  • Timeout - Wait for expiration and verify challenge.failed with expired code
  • Network Issues - Test behavior when webhook delivery fails

Next Steps