Skip to main content

Terminal H2H SDK for iOS (Swift)

The Terminal H2H SDK for iOS enables you to integrate secure payment processing directly into your iOS applications. Connect to physical payment terminals and process transactions seamlessly using our comprehensive Swift SDK.
This SDK works alongside the Terminal API to provide a complete in-person payment solution. You’ll use the Terminal API to create payment sessions and the Terminal H2H SDK to interact with physical payment devices.

Version information

What’s new:
  • BRI payment method mapping: Fixed case sensitivity in BRI mapping logic. BRI payment methods (such as QRIS) now map correctly regardless of string casing.
What’s new:
  • Core Stability: Fixed activity tracking bug in TerminalApplication where paused activities were not properly removed from internal tracking list
What’s new:
  • Fixed casting issue on C2C request payload to improve compatibility and prevent runtime errors.
What’s new:
  • Added Cashup provider support for Indonesian terminals
What’s new:
  • Renamed class name TerminalGateway to TerminalH2H for better consistency
Breaking Change: Class name changed from TerminalGateway to TerminalH2H. Update your imports and references accordingly.
What’s new:
  • Fixed NTT payment method value mapping to ensure correct provider selection
  • Updated BRI payment flow to validate transaction data before executing terminal actions
  • Added timeout configuration for card and QR transactions to auto-cancel and retry stalled requests
  • Added support to handle retry requests via /v1/terminal/sessions/{id}/retry endpoint
What’s new:
  • Added support for multiple concurrent device connections, enabling simultaneous transactions across different terminals
  • [BRI] Fixed status value handling in void and cancel API responses for improved transaction status accuracy
What’s new:
  • Introduced command ID handling for settlement operations
  • Enhanced retry logic with configurable attempt counts
  • Improved error handling and logging throughout the gateway service
Bug fixes and improvements:
  • Fix data mapping for terminal responses
  • [BRI] Enhanced status verification after transaction timeout for improved reliability
XenTerminal is the companion SDK to In-Person Payment Sessions API. This version provides core functionality for connecting to payment terminals and processing transactions.
The SDK follows semantic versioning. Breaking changes will bump the major version number.

Installation

Install the Terminal SDK using Swift Package Manager (SPM) in Xcode:
1

Open package dependencies in Xcode

In Xcode, open your project and choose File → Add Package Dependencies….
Opening the Add Package Dependencies menu in Xcode
2

Add Xendit package URL

Enter this repository URL in the package search field:
Then click Add Package.
3

Select version and target

Choose your dependency rule (recommended: Up to Next Major Version) and make sure your app target is selected before confirming.
4

Configure build settings

Go to Build Settings and make the following changes:
  • Search for ENABLE_USER_SCRIPT_SANDBOXING and set it to NO
  • Search for Other Linker Flags and add -lsqlite3
Setting ENABLE_USER_SCRIPT_SANDBOXING to NO in Xcode Build Settings
Adding -lsqlite3 to Other Linker Flags in Xcode Build Settings

Getting Started

Before starting, you’ll need an In-Person Payment CLIENT_KEY from the Xendit In-Person Payment team. You will also need the terminal IP address.
Terminal H2H requires physical payment devices to function. Contact the Xendit team to obtain compatible terminal devices and configuration details.

Step 1: Initialize SDK

Import the SDK module and call TerminalApp.shared.initialize from your application entry point:
AppDelegate.swift
The SDK supports two modes:
Use TerminalMode.integration for development and testing with physical terminals. Transactions are sent to Test Mode on the Xendit Dashboard.

Step 2: Add Terminal Providers

Add the specific terminal providers you need for your integration:
For Share Commerce (SHC), Cashup, and Atom terminals, you do not need to add a Terminal H2H provider. Those devices run terminal logic through the Gateway app installed on the hardware. If the app is missing, install it from the Gateway download page or contact inpersonpayments@xendit.co for help.
BRI provider supports timeout configuration for card and QR transactions, and provides enhanced transaction retry capabilities.
After adding providers, they will be available for use when registering terminal devices in the next step.

Step 3: Register Terminal Device

Create terminal device entries using TerminalDevice.companion.create and register them with the gateway:
For detailed instructions on finding Terminal ID and IP address for different terminal providers, see our Finding Terminal Information guide.

Step 4: Calling Terminal API

With Terminal H2H SDK configured, you can now process payments using the Terminal API. The SDK handles communication with physical terminals through the local gateway service.
For complete API documentation including request/response formats, error handling, and advanced features, see the Terminal API (H2H) documentation.
The Terminal H2H SDK automatically manages the connection to your registered terminal devices and handles communication protocols for different providers.
You’re now ready to process payments using the Terminal H2H SDK integrated with Terminal API.

Optional Methods

Set Operation Timeout

Configure the maximum allowed time for operations to complete before the service cancels and retries the transaction:

Restart Terminal Connection

Manage and restart terminal service connections:
Call the method without parameters to restart all connections and tasks:

Observing Connection State

Monitor Terminal connection status using the observeEDCConnection method:
The SDK handles the following connection states:

Observing Error State

Monitor Terminal error states using the observeError method:

Error Handling

Error Data Structure

All errors returned by the Terminal H2H SDK follow this structure:

Error Codes Reference

Error Handling Best Practices

Implement comprehensive error handling for robust payment processing:
Always implement retry logic for transient errors like TERMINAL_BUSY and FAILED_TO_CONNECT. Use exponential backoff to avoid overwhelming the terminal.

Troubleshooting

For more recovery scenarios across H2H and C2C terminal flows, see the SDK Troubleshooting Guide.

Common Issues and Solutions

Problem: The EDC (Electronic Data Capture) machine becomes unresponsive or stops processing transactions.Solution:
  1. Restart the EDC machine by holding the power button and selecting “Restart”
  2. Wait for the device to fully boot up and reconnect
  3. Verify the terminal is back online using the connection monitoring features
Always ensure the EDC is properly restarted before attempting new transactions to avoid data corruption.
Problem: Unexpected behaviors or unauthorized access to terminal functions.Solution:
  1. Ensure all transactions are initiated only through the SDK
  2. Contact the Xendit EDC team to enable POS-only mode for your Terminal IDs
  3. Configure terminal settings to disable manual transaction entry
POS-only mode prevents manual transaction entry and ensures all operations go through your application.
Problem: EDC fails to send transaction results to the SDK after payment completion.Solution:
  1. Query the Payment Session using the Terminal API to retrieve the latest status
  2. Check network connectivity between the EDC and your application
  3. Verify the callback URL configuration in your payment session
  4. Implement retry logic for failed status updates
Problem: Transaction appears stuck or you don’t receive a callback after the terminal prints a receipt, indicating the transaction may be incomplete.
This troubleshooting section applies only to BRI terminals.
Solution: Call the Terminal API retry endpoint to request the app check the transaction status and redo the transaction if it’s incomplete:
The retry endpoint /v1/terminal/sessions/{id}/retry instructs the app to verify the current transaction status with the terminal and automatically redo the transaction if it’s found to be incomplete.
Use this retry mechanism when you see a receipt printed but haven’t received a callback, as it may indicate the transaction didn’t complete successfully on the terminal side.
Problem: Unable to establish or maintain connection with terminal devices.Solutions:
  • Check network connectivity: Ensure both devices are on the same network
  • Verify IP addresses: Confirm terminal IP addresses are correct and accessible
  • Firewall settings: Check if firewall is blocking the connection ports
  • Terminal status: Ensure the terminal is powered on and in ready state
  • SDK initialization: Verify client key and terminal configuration
Use the connection monitoring features to diagnose specific connection issues.

Finding Terminal Information

1

Find Terminal ID (TID)

Open the BRI FMS app on the terminal device and locate the Terminal ID in the device information section.
BRI terminal showing Terminal ID in FMS app
2

Find IP Address

Open the ECRLink app on the terminal and check the network settings for the IP address.
BRI terminal showing IP address in ECRLink app
Screenshots and UI layouts may vary by firmware or app version. Refer to the latest vendor documentation if the interface differs from these instructions.