Docs
Payments
Collect a Payment
In-Person Payments

In-Person Payments

supports in-person payments on both TSYS and Paysafe, giving you the flexibility to choose the processor and terminal setup that best suits your business needs. This guide will walk you through the process of setting up your integration, from selecting your processor and terminals to handling key payment scenarios.

ℹ️
Paysafe's in-person payments solution is in its beta phase. If you are interested in joining the beta, please reach out to .

Design Your Integration

Choose your processor

offers an in-person payments solution on each of our processors. If you haven’t already, consider which processor you will use.

Choose your terminals

The terminal options available to you depend on the processor you are using for in-person payments.

Valor terminals with TSYS

  • VL100: Best for countertop use
  • VL110: Best for handheld use

PAX terminals with Paysafe

  • A920
  • A920 Pro
  • A80

Check out our online store (opens in a new tab) for more information.

Identify required functionality

There are several in-person payments features to choose from which you can implement during your integration.

Order Developer Terminals

To test your integration, you’ll need a developer terminal. The easiest and most convenient option is to order a developer terminal (opens in a new tab) from . The terminal will arrive within a few business days, fully activated and ready to use. Simply connect it to Wi-Fi to get started.

If you already own a developer terminal, you can use it as long as it is a VL100 or VL110 model and suitable for test environments. To use your own terminal:

  1. Email support to request an Activation Code.
  2. Enter the Activation Code onto the terminal to associate it with your test account.

Collect an In-Person Payment

If you are already familiar with collecting online payments using , the process for in-person payments will be similar.

Retrieve the terminal id

When a merchant orders a terminal, associates the device’s serial number with the merchant’s account and assigns a unique terminal_reader_id. Before processing a payment, List all Terminal ReadersAPI linked to the merchant’s account to specify the device from which the payment will be collected.

curl -L {{PRODUCTION_API_URL}}/v1/terminal-readers/{{TERMINAL_ID}} \
    -H '{{ACCOUNT_HEADER}}-account: {{MERCHANT_ACCOUNT_ID}}' \
    -H 'Content-Type: application/json' \
    -H '{{ACCOUNT_HEADER}}-api-key: {{SECRET_KEY}}' \

Create a card-present payment method

To Create a Payment MethodAPI for an in-person payment, set the type=card_present and include the terminal_reader_id of the intended device.

Create a Payment Method sample request

curl -L '{{PRODUCTION_API_URL}}/v1/payment-methods' \
    -H '{{ACCOUNT_HEADER}}-account: {{MERCHANT_ACCOUNT_ID}}' \
    -H 'Content-Type: application/json' \
    -H '{{ACCOUNT_HEADER}}-api-key: {{SECRET_KEY}}' \
    -d '{
    "type": "card_present",
    "terminal_reader_id": "{{TERMINAL_READER_ID}}"
  }'

Collect the payment

Begin by creating a payment intent. Specify the payment_method_type property as card_present and use the payment_method_id obtained from the previous step. Confirming the payment intent transitions its status to requires_action, indicating that the payment intent has been sent to the terminal, prompting the customer to complete the payment.

Create a payment intent sample request

curl -L '{{PRODUCTION_API_URL}}/v1/payment-intents' \
    -H '{{ACCOUNT_HEADER}}-account: {{MERCHANT_ACCOUNT_ID}}' \
    -H 'Content-Type: application/json' \
    -H '{{ACCOUNT_HEADER}}-api-key: {{SECRET_KEY}}' \
    -d '{
    "amount": 1000,
    "currency": "usd",
    "payment_method_types": [
      "card_present"
    ],
    "confirm": true,
    "capture_method": "automatic",
    "payment_method_id": "pm_oeWN5ipwtWkF0N2n7t1zs"
    }'

Complete the payment

Swipe or tap a payment method on the terminal to complete the payment.

Confirm payment intent success

Create a Webhook EndpointAPI for payment_intent_events to receive updates about the success of the payment intent and the associated payment details.

Key Scenarios to Handle

Partial authorizations

A Partial Authorization occurs when a payment is attempted for the full amount, but there are insufficient funds to cover it. Only the available amount is captured. It’s important that your software handles this flow, so that the merchant is aware when the full amount is not captured and can choose to create another payment for the difference.

When there is a partial authorization, the API status for the charge is succeeded. Developers should compare either charge.amount_captured or payment_intent.amount_received to the original charge amount to determine how much was actually received.

Same-day refunds

All refunds are initiated through the Create a RefundAPI endpoint.

For same-day refunds on payments made via a Paysafe terminal reader, the refund must be initiated through the terminal reader, which needs to be powered on and connected to the internet. If the terminal is offline, the same-day refund will not go through. Next-day or later refunds can be processed without the terminal being powered on or connected. Make sure your software is set up to handle these refund events: charge.refund.pending and charge.refunded.

Same-day refunds for payments made through TSYS terminal readers are not processed through the terminal.

Certify Your Integration

After completing your integration, you need to certify it by handling specific payment scenarios. If you've implemented additional in-person features such as tip settings or card saving, ensure you test those flows as well.

The developer tasks below are required to be completed in before launching your card-present solution with :

FAQ

How do I calculate the tip amount?To calculate the tip amount when tips are enabled, subtract the payment_intent.amount from the payment_intent.amount_received.
What payment methods are supported?Card, Apple Pay, Google Pay, and Samsung Pay are supported for in-person payments. HSA/FSA cards are not supported at this time.
Can I switch in-person payment providers?Yes, you can switch between in-person payment providers. If you're moving from TSYS to Paysafe for in-person payments, keep in mind these key differences:
  • Manual capture: Manual capture is not supported by the Paysafe in-person payments solution.
  • Same-day refunds: Same-day refunds for Paysafe are processed directly on the terminal reader. Your software will need to handle refund webhooks to track the final status of each refund.
  • Printed receipts: Printed receipts cannot be controlled via the API with Paysafe’s terminals. If you’ve used this feature with TSYS, make sure to disable it in your software and provide merchants with instructions to manage receipts directly from their terminal reader.