{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-docs/sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":[]},"type":"markdown"},"seo":{"title":"Integration guide for Android POS app","llmstxt":{"hide":false,"sections":[{"title":"Table of contents","includeFiles":["**/*"],"excludeFiles":[]}],"excludeFiles":[]}},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"integration-guide-for-android-pos-app","__idx":0},"children":["Integration guide for Android POS app"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Integrate your Android POS app with the Tyro Tap to Pay app."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"prerequisites","__idx":1},"children":["Prerequisites"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Your native Android POS app (minimum version: Android 12 / API 31)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Tyro Tap to Pay installed on the merchant's device"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Location permission is granted for the Tap to Pay app"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["A valid Tyro POS client ID (provided by Tyro)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["A single client library (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["TapToPayClient"]},") handles both activity launches and headless commands"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"how-app-to-app-integration-works","__idx":2},"children":["How app-to-app integration works"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Your POS app calls ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["TapToPayClient"]}," methods."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["For foreground operations (pairing, transactions), the client launches the Tap to Pay app."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Tap to Pay processes the request and returns a transaction result."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Your app handles the result and continues."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"implement-merchant-authorisation","__idx":3},"children":["Implement merchant authorisation"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Only supported in production. These are the steps for a merchant to authorise your POS to call the Tap to Pay app:"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Your POS generates and sends the merchant the unique Tyro Integration Portal URL, for example ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["https://integrate.tyro.com/embedded-payments?posId=[client_id]&posReference=[pos_reference]"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The merchant signs into the Tyro Integration Portal with a ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["System Admin"]}," role."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The merchant authorises the POS for every MID that will use Tap to Pay."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Your POS receives or retrieves confirmation."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Your POS can access the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/api-explorer/tap-to-pay/1.0"},"children":["Embedded Payments API"]},", including transaction results from the authorised MID(s)."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This is the same Integration Portal mechanism used for ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/in-person-payments/tap-to-pay/integration-guide/sdk/account-authorisation"},"children":["account authorisation on the SDK path"]}," — the merchant authorises your POS for a MID once, regardless of which integration model you're using."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"set-up-the-client","__idx":4},"children":["Set up the client"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"1-add-the-client-sdk-to-your-build-file","__idx":5},"children":["1. Add the client SDK to your build file"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"dependencies {\n    implementation(\"com.tyro:taptopay-app-client:<VERSION>\")\n}\n"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"2-initialise-in-applicationoncreate","__idx":6},"children":["2. Initialise in Application.onCreate()"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"kotlin","header":{"controls":{"copy":{}}},"source":"import com.tyro.taptopay.mpoc.client.api.TapToPayClient\n\nclass MyApplication : Application() {\n    override fun onCreate() {\n        super.onCreate()\n        // Create singleton instance\n        TapToPayClient.createInstance(applicationContext)\n    }\n}\n","lang":"kotlin"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"3-register-result-handlers-in-activityoncreate","__idx":7},"children":["3. Register result handlers in Activity.onCreate()"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["In your payment activity, register handlers ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["before"]}," you start any transactions:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"kotlin","header":{"controls":{"copy":{}}},"source":"import com.tyro.taptopay.mpoc.client.api.TapToPayClient\nimport com.tyro.taptopay.sdk.api.data.TransactionStatus\n\nclass PaymentActivity : AppCompatActivity() {\n    private lateinit var client: TapToPayClient\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.activity_payment)\n\n        client = TapToPayClient.instance\n\n        // REQUIRED: Register result handler before any transactions or pairing\n        client.registerTransactionResultHandler(this) { result ->\n            when (result.status) {\n                TransactionStatus.TXN_SUCCESS -> {\n                    showSuccess(\"Payment approved\")\n                    println(\"Approved: $${result.detail?.amount?.toLong()?.div(100)}\")\n                }\n                TransactionStatus.TXN_DECLINED -> {\n                    showError(\"Card declined\")\n                }\n                TransactionStatus.TXN_CANCELLED -> {\n                    showMessage(\"Payment cancelled by user\")\n                }\n                else -> {\n                    showError(\"Payment failed: ${result.errorMessage}\")\n                }\n            }\n        }\n    }\n\n    private fun showSuccess(msg: String) { /* your UI */ }\n    private fun showError(msg: String) { /* your UI */ }\n    private fun showMessage(msg: String) { /* your UI */ }\n}\n","lang":"kotlin"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"core-operations","__idx":8},"children":["Core operations"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"1-pair-your-pos-with-tap-to-pay-once","__idx":9},"children":["1. Pair your POS with Tap to Pay (once)"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Call this once to establish trust between your POS and Tap to Pay."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"kotlin","header":{"controls":{"copy":{}}},"source":"fun onPairClicked() = lifecycleScope.launch(Dispatchers.Main.immediate) {\n    val result = client.pairWithTapToPayApp(posClientId = \"YOUR-POS-CLIENT-ID\")\n\n    when (result) {\n        is PairingResult.TapToPayAppPairingSuccess -> {\n            showMessage(\"Paired successfully! Ready to process payments.\")\n        }\n        is PairingResult.TapToPayAppPairingFailed -> {\n            val reason = result.reason  // USER_CANCELLED, PAIRING_FAILED, etc.\n            val msg = result.errorMessage ?: reason.toString()\n            showError(\"Pairing failed: $msg\")\n        }\n    }\n}\n","lang":"kotlin"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["What happens:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Tap to Pay shows a login screen."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The merchant logs in with their Tyro account with the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["System Admin"]}," permisison."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Trust is established; future transactions won't require re-login."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"2-set-pos-info","__idx":10},"children":["2. Set POS info"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Tell Tap to Pay about your POS. This shows up in receipts and Tyro's reporting."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"kotlin","header":{"controls":{"copy":{}}},"source":"fun setupPosInfo() {\n    val posInfo = PosInfo(\n        posName = \"Register 1\",\n        posVendor = \"My POS Software Inc\",\n        posVersion = \"2.1.0\",\n        siteReference = \"STORE-456\"\n    )\n    client.setPosInfo(posInfo)\n}\n","lang":"kotlin"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If you don't set POS info here, you must pass it with each transaction request instead."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"3-ux-customisation-optional","__idx":11},"children":["3. UX customisation (optional)"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Control where the NFC tap icon appears on the present card screen — for example a small device 1x3 grid vs a large device 3x3 grid. See ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/in-person-payments/tap-to-pay/integration-guide/sdk/android/sdk/set-tap-to-pay-ux-options"},"children":["Configure Tap to Pay UX Options"]}," for more details."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"kotlin","header":{"controls":{"copy":{}}},"source":"fun setTapZone() {\n    val uiOptions = TapToPayUxOptions.Builder()\n        .setTapZone(\n            TapZone.Large(\n                NfcPosition.TopRight,\n                DeviceOrientation.PORTRAIT\n            )\n        )\n        .build()\n\n    client.setTapToPayUxOptions(uiOptions)\n}\n","lang":"kotlin"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"4-start-a-transaction","__idx":12},"children":["4. Start a transaction"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Process a card-present transaction."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"kotlin","header":{"controls":{"copy":{}}},"source":"fun onPayClicked(amountCents: Int, orderReference: String) {\n    val request = TransactionRequest(\n        type = TransactionType.PURCHASE,\n        amountInCents = amountCents,\n        reference = orderReference\n    )\n\n    // Result comes back via the registered handler\n    client.startTransaction(this, request)\n}\n","lang":"kotlin"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The result comes back via the transaction handler already registered in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onCreate()"]}," — ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["result.status"]}," will be one of the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#transaction-status-codes"},"children":["transaction status codes"]}," below, with full detail available in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["result.detail"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"5-cancel-a-transaction-optional","__idx":13},"children":["5. Cancel a transaction (optional)"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If the transaction is still in progress, cancel it."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"kotlin","header":{"controls":{"copy":{}}},"source":"fun onCancelClicked() = lifecycleScope.launch {\n    val success = client.cancelTransaction()\n    if (success) {\n        showMessage(\"Transaction cancelled\")\n    } else {\n        showError(\"Could not cancel (may already be complete)\")\n    }\n}\n","lang":"kotlin"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"6-send-a-digital-receipt-optional","__idx":14},"children":["6. Send a digital receipt (optional)"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Email a receipt to the customer."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"kotlin","header":{"controls":{"copy":{}}},"source":"fun onSendReceiptClicked(transactionId: String, email: String) = lifecycleScope.launch {\n    val success = client.sendDigitalReceipt(transactionId, email)\n    if (success) {\n        showMessage(\"Receipt sent to $email\")\n    } else {\n        showError(\"Could not send receipt\")\n    }\n}\n","lang":"kotlin"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"other-operations","__idx":15},"children":["Other operations"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"haptic-feedback","__idx":16},"children":["Haptic feedback"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Enable or disable tactile feedback:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"kotlin","header":{"controls":{"copy":{}}},"source":"client.toggleHapticFeedback(enabled = true)\n","lang":"kotlin"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"getting-the-sdk-version","__idx":17},"children":["Getting the SDK version"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"kotlin","header":{"controls":{"copy":{}}},"source":"val version = client.getSdkVersion()  // e.g., \"1.2.3\"\n","lang":"kotlin"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"transaction-status-codes","__idx":18},"children":["Transaction status codes"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["After Tap to Pay processes a transaction:"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Status"},"children":["Status"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Meaning"},"children":["Meaning"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Action"},"children":["Action"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["TXN_SUCCESS"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Payment approved"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Proceed with fulfilment"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["TXN_DECLINED"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Card declined"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Prompt for another card"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["TXN_FAILED"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Transaction failed (generic)"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Show error, retry or fall back"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["TXN_CANCELLED"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["User cancelled"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Prompt user to try again"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["TXN_TIMEOUT"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Transaction timed out"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Network issue; retry"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["TXN_CARD_EXPIRED"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Card expired"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Ask for a different card"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["TXN_ONLINE_ERROR"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Connection lost during authorisation"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Retry or save for later"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["TXN_OFFLINE_DECLINE"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Offline decline"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Try a different card"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["TXN_NO_APP_ERROR"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Tap to Pay not installed"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Direct the user to the Play Store"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["TXN_PERMISSIONS_ERROR"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Missing permissions"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Check NFC/location permissions"]}]}]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"error-handling","__idx":19},"children":["Error handling"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["App not installed:"]}," catch ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["TapToPayAppNotInstalledException"]}," and direct the user to the Play Store."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Version mismatch:"]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["UNSUPPORTED_TAPTOPAY_APP_VERSION"]}," in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PairingResult"]}," — update Tap to Pay."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Permissions:"]}," check ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["INIT_REQUEST_PERMISSIONS_ERROR"]}," and request missing permissions."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Network:"]}," retry with exponential backoff on ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["INIT_CONNECTION_ERROR"]}," or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["TXN_ONLINE_ERROR"]},"."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"support-and-next-steps","__idx":20},"children":["Support and next steps"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Contact Tyro to receive your unique ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["posClientId"]}," for production use, and to have your account set up in UAT with test credentials. Work with Tyro's integration team to verify your manifest setup and dependencies, test pairing and transactions in UAT, resolve version compatibility issues, and optimise NFC tap zones for your UI."]}]},"headings":[{"value":"Integration guide for Android POS app","id":"integration-guide-for-android-pos-app","depth":1},{"value":"Prerequisites","id":"prerequisites","depth":2},{"value":"How app-to-app integration works","id":"how-app-to-app-integration-works","depth":2},{"value":"Implement merchant authorisation","id":"implement-merchant-authorisation","depth":2},{"value":"Set up the client","id":"set-up-the-client","depth":2},{"value":"1. Add the client SDK to your build file","id":"1-add-the-client-sdk-to-your-build-file","depth":3},{"value":"2. Initialise in Application.onCreate()","id":"2-initialise-in-applicationoncreate","depth":3},{"value":"3. Register result handlers in Activity.onCreate()","id":"3-register-result-handlers-in-activityoncreate","depth":3},{"value":"Core operations","id":"core-operations","depth":2},{"value":"1. Pair your POS with Tap to Pay (once)","id":"1-pair-your-pos-with-tap-to-pay-once","depth":3},{"value":"2. Set POS info","id":"2-set-pos-info","depth":3},{"value":"3. UX customisation (optional)","id":"3-ux-customisation-optional","depth":3},{"value":"4. Start a transaction","id":"4-start-a-transaction","depth":3},{"value":"5. Cancel a transaction (optional)","id":"5-cancel-a-transaction-optional","depth":3},{"value":"6. Send a digital receipt (optional)","id":"6-send-a-digital-receipt-optional","depth":3},{"value":"Other operations","id":"other-operations","depth":2},{"value":"Haptic feedback","id":"haptic-feedback","depth":3},{"value":"Getting the SDK version","id":"getting-the-sdk-version","depth":3},{"value":"Transaction status codes","id":"transaction-status-codes","depth":2},{"value":"Error handling","id":"error-handling","depth":3},{"value":"Support and next steps","id":"support-and-next-steps","depth":2}],"frontmatter":{"title":"Integration guide for Android POS app","seo":{"title":"Integration guide for Android POS app"}},"lastModified":"2026-09-21T06:17:33.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/docs/in-person-payments/tap-to-pay/integration-guide/android-app","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}