Card Present (EMV Chip) Transactions

A Card Present (CP) EMV chip transaction lets you process payments by reading encrypted card data from the chip embedded in the cardholder's card. The cardholder inserts their chip card into a compatible chip reader and leaves it in place until prompted to remove.

Unlike swipe transactions that read static data from the magnetic stripe, EMV chip transactions generate a unique cryptogram per payment — making them significantly more secure and qualifying for the lowest available interchange rates for card-present transactions.

Common use cases include:

  • Standard Card-Present Checkout: The cardholder is physically present and the card has an embedded chip — the preferred entry mode over swipe when chip hardware is available.
  • Retail and Hospitality: In-person environments where fraud prevention and lowest interchange rates are a priority.
  • Fallback from Contactless: NFC tap is unavailable or declined by the card, and the cardholder inserts the chip as an alternative.

How it Works

EMV chip CP transactions require you to set cardPresent to true and populate the posData object with chip-specific values. Two configurations are supported depending on whether you intend to capture the payment immediately or at a later time.

EMV Authorization (Preauthorization)

Use this configuration when performing an authorization-only transaction that will be captured later. Set authorizationIndicator to "Undefined" and transactionStatus to "Preauthorization".

{
  "cardPresent": true,
  "authorizationIndicator": "Undefined",
  "posData": {
    "cardholderPresence": "Present",
    "deviceAttendance": "Attended",
    "deviceInputCapability": "ChipSwipe",
    "deviceLocation": "OnPremise",
    "panCaptureMethod": "Chip",
    "partialApprovalSupport": "Supported",
    "transactionStatus": "Preauthorization"
  }
}

EMV Sale

Use this configuration when the transaction is intended to be finalized immediately. Set authorizationIndicator to "Final" and transactionStatus to "Normal".

{
  "cardPresent": true,
  "authorizationIndicator": "Final",
  "posData": {
    "cardholderPresence": "Present",
    "deviceAttendance": "Attended",
    "deviceInputCapability": "ChipSwipe",
    "deviceLocation": "OnPremise",
    "panCaptureMethod": "Chip",
    "partialApprovalSupport": "Supported",
    "transactionStatus": "Normal"
  }
}

Understanding Partial Approvals

The partialApprovalSupport field determines whether the issuing bank can approve a portion of the requested amount when the card has insufficient funds for the full transaction.

ValueDescriptionWhen to use
SupportedThe issuer can approve a partial amount. Your application collects the remaining balance using another payment method.Use when your application supports split-tender payments.
NotSupportedThe transaction is declined if insufficient funds are available. No partial approval is returned.Use when your application does not support multiple payment methods for a single transaction.

Example: Purchase amount is $100. Available funds on the card are $60. The issuer approves $60, and the merchant collects the remaining $40 using another payment method.


Best Practices

PracticeDescription
Prefer EMV chip over swipe when availableEMV chip carries a significantly lower fraud risk and qualifies for lower interchange rates than magnetic stripe. Always use chip when the card and hardware support it.
Set panCaptureMethod to "Chip"Passing an incorrect capture method will result in interchange downgrade or network decline.
Set deviceInputCapability to "ChipSwipe"This declares that the device supports both chip and swipe entry, which is required for correct interchange classification on EMV transactions.
Accurately reflect the transaction environment in posDataEach posData field must match the actual transaction context. Incorrect values cause interchange downgrades or network declines.
Handle partial approvals explicitlyIf your application supports split-tender payments, set partialApprovalSupport to "Supported" and handle partial approval responses in your integration logic.


.readme-logo { display: none !important; }