> This is Payabli documentation. For a complete page index, fetch https://docs.payabli.com/llms.txt — append .md to any page URL for lightweight markdown. For section-level indexes, query parameters, and other AI-optimized access methods, see https://docs.payabli.com/ai-agents.md

# Tap to Pay overview

> Learn how Tap to Pay lets your app accept contactless, card-present payments with no external hardware

Tap to Pay (also called SoftPOS) turns a partner's phone into a card-present payment terminal. A payor taps their contactless card, phone, or watch against the device. No external card reader is required. Because it's a card-present transaction, it qualifies for card-present interchange rates. The payment happens inside the partner's own app, under the partner's own brand.

Tap to Pay is a payment method, built on Payabli's mobile SDK. Right now, only iOS is supported. See [Tap to Pay](/guides/mobile-components-tap-to-pay) for the component reference.

## How Tap to Pay works

A Tap to Pay charge moves through six steps, from requesting an access token to receiving a transaction result. Device setup (initializing the SDK) and reading a card happen separately. Initializing the SDK doesn't touch the card at all:

#### Partner app requests an access token

Before accepting a payment, the partner app asks its own backend for a short-lived Payabli access token. The Payabli `clientSecret` never leaves the backend.

#### Partner backend exchanges credentials for a token

The backend calls Payabli's token endpoint with its `clientId` and `clientSecret` and returns the resulting access token to the app.

#### App initializes the SDK

The app calls the mobile SDK's `initialize()` method, which performs one-time device attestation and prepares the reader. No card is read yet.

#### SDK starts the charge

The app calls `charge()`. The SDK sends the transaction details to Payabli's Pay In API, which returns a transaction ID before any card is read.

#### SDK reads the card and gets authorization

The SDK prompts the payor to tap their card, phone, or watch and reads the card. The SDK then sends the card data to the processor, which requests authorization from the card network.

#### SDK confirms the result with Payabli

The SDK notifies Payabli that the payment is complete, and Payabli stores the authorization data with the transaction. The SDK then returns a transaction result to the app, including the `paymentTransId` used to track the payment in Payabli.

<img src="https://fdr-prod-docs-files-public.s3.us-east-1.amazonaws.com/payabli.docs.buildwithfern.com/d7347b1a73acacf213a933440cc7f14dd7508377bda5065a47bdac2c67830cb1/images/generated-diagrams/tap-to-pay-overview.svg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIA6KXJSKKNFOCF7G4B%2F20260725%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260725T095307Z&X-Amz-Expires=604800&X-Amz-Signature=919ace4e74aaaf8a8b18bc9d356a15db2f8275ffb430d40fbec81a4705cdfc19&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject" alt="Tap to Pay sequence from access token request through card network authorization" aria-describedby="tap-to-pay-overview-desc" />

<h4>
  Diagram: Tap to Pay transaction flow
</h4>

This diagram shows the sequence of calls between the partner app, the partner's backend, Payabli, the processor, and the card network:

1. The partner app requests an access token from the partner backend.
2. The partner backend exchanges its `clientId` and `clientSecret` with Payabli for an access token, then returns it to the app.
3. The app initializes the SDK, which performs device attestation. No card is read yet.
4. The app starts the charge. Payabli returns a transaction ID before any card is read.
5. The app reads the payor's contactless card, phone, or watch over NFC, then sends the card data to the processor, which requests authorization from the card network.
6. The app notifies Payabli that the payment is complete, and Payabli stores the authorization data with the transaction.
7. Payabli returns the transaction result, including the `paymentTransId`, to the partner app.

## Supported payment types

Tap to Pay accepts:

* **Tokenized NFC card (digital wallet).** A card provisioned into a digital wallet, such as Apple Pay or Google Pay, on a payor's NFC-capable phone or smartwatch.
* **NFC-enabled card.** A physical contactless card from Visa, Mastercard, Discover, or American Express.

## Requirements

Tap to Pay requires a physical device. See [Accept Tap to Pay payments: Prerequisites](/guides/pay-in-developer-tap-to-pay#prerequisites) for the full checklist, including minimum OS and hardware versions.

## First-time device activation

The first time a device runs your app, attestation succeeds but the device is marked pending, and the SDK throws `devicePendingActivation`. Your backend requests a one-time activation code from Payabli, and your app delivers it to the user by email, SMS, or in-app. After the user enters the code and the app submits it, the device is authorized for all future sessions. See [Integration steps](/guides/pay-in-developer-tap-to-pay#integration-steps) for the implementation details.

<img src="https://fdr-prod-docs-files-public.s3.us-east-1.amazonaws.com/payabli.docs.buildwithfern.com/5cb11ecb6de358b9ef2513e6e2aa8b54fd4257cb2fe30ff8e30e61639e239450/images/generated-diagrams/tap-to-pay-first-activation.svg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIA6KXJSKKNFOCF7G4B%2F20260725%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260725T095307Z&X-Amz-Expires=604800&X-Amz-Signature=7c63e01a0d66a8ebb6373789a9ff553e64a6af17010e0cb932adbb3bffe924f6&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject" alt="First-time Tap to Pay device activation sequence from pending device registration through re-initialization" aria-describedby="tap-to-pay-first-activation-desc" />

<h4>
  Diagram: First-time device activation
</h4>

This diagram shows the sequence for activating a device the first time it runs your app:

1. The app calls `initialize()`, which asks Payabli's device service to run an App Attest check.
2. The device service completes attestation but marks the device as pending.
3. The app throws `devicePendingActivation`.
4. The app calls its own backend, which requests a one-time activation code from Payabli.
5. The backend returns the activation code and its expiration to the app.
6. The app delivers the code to the user by email, SMS, or in-app.
7. The user enters the code in the app.
8. The app calls `activateDevice(activationCode:)`, which sends the code to Payabli's device service.
9. The device service confirms the activation.
10. The app calls `initialize()` again.
11. Because attestation is already cached, `initialize()` skips straight to fetching configuration and preparing the reader, and the session becomes ready.

## Next steps

* [Accept Tap to Pay payments](/guides/pay-in-developer-tap-to-pay) walks through the full Tap to Pay integration, including paypoint registration, Apple entitlements, and device activation.
* [Tap to Pay](/guides/mobile-components-tap-to-pay) documents the `PayabliSDKTapToPay` component, including its full implementation reference and example app.

## Related resources

See these related resources to help you get the most out of Payabli.

#### Next steps

* **[Accept Tap to Pay payments](/guides/pay-in-developer-tap-to-pay)** - Integrate Tap to Pay in your native iOS app, from paypoint registration through your first charge

#### Related topics

* **[Tap to Pay](/guides/mobile-components-tap-to-pay)** - Add native Tap to Pay payments to your mobile app with PayabliSDKTapToPay