Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/mercadopago/sdk-java/llms.txt

Use this file to discover all available pages before exploring further.

The Mercado Pago Point Integration API lets you orchestrate in-person, card-present payments through physical Point card readers directly from your server-side application. Your backend communicates with the API to push payment intents to a registered device, check their progress, and manage the device fleet — while the Point hardware handles the customer-facing card interaction. This guide walks through every operation exposed by PointClient, from listing devices and switching operating modes to creating, querying, and cancelling payment intents.

Prerequisites

  • A Mercado Pago account with at least one registered Point device.
  • A valid access token set in MercadoPagoConfig (or passed per-request via MPRequestOptions).
  • Maven/Gradle dependency for the Mercado Pago Java SDK.
MercadoPagoConfig.setAccessToken("APP_USR-your-access-token");
PointClient client = new PointClient();

Devices

List devices

Use getDevices(MPSearchRequest) to retrieve all Point devices associated with the authenticated account. The result is paginated — use limit and offset to walk through large fleets, and filters to narrow results by POS or store.
import com.mercadopago.client.point.PointClient;
import com.mercadopago.net.MPSearchRequest;
import com.mercadopago.resources.point.PointDevices;
import com.mercadopago.resources.point.PointDevice;

PointClient client = new PointClient();

MPSearchRequest searchRequest = MPSearchRequest.builder()
    .limit(50)
    .offset(0)
    .build();

PointDevices devices = client.getDevices(searchRequest);

for (PointDevice device : devices.getDevices()) {
    System.out.println("Device ID:      " + device.getId());
    System.out.println("Operating mode: " + device.getOperatingMode());
}

// Pagination metadata
System.out.println("Total: " + devices.getPaging().getTotal());
To filter by store or POS, pass the corresponding key/value pairs in the filters map of MPSearchRequest.
MPSearchRequest searchRequest = MPSearchRequest.builder()
    .limit(10)
    .offset(0)
    .filters(Map.<String, Object>of("store_id", "123456"))
    .build();

Change device operating mode

A Point device can operate in two modes:
ModeDescription
PDVPoint-of-Sale mode — the device is linked to a POS system and receives payment intents from your integration.
STANDALONEThe device operates independently, accepting payments through its own interface without server coordination.
Switch modes with changeDeviceOperatingMode(deviceId, request):
import com.mercadopago.client.point.PointClient;
import com.mercadopago.client.point.PointDeviceOperatingModeRequest;
import com.mercadopago.client.point.OperatingMode;
import com.mercadopago.resources.point.PointDeviceOperatingMode;

PointClient client = new PointClient();

PointDeviceOperatingModeRequest modeRequest = PointDeviceOperatingModeRequest.builder()
    .operatingMode(OperatingMode.PDV)
    .build();

PointDeviceOperatingMode result = client.changeDeviceOperatingMode("PAX_A910__SMARTPOS123456", modeRequest);

System.out.println("New mode: " + result.getOperatingMode());
Payment intents can only be created while a device is in PDV mode. If the device is in STANDALONE mode, the API will return an error.

Payment Intents

A payment intent is a server-side instruction that tells a specific Point device to prompt the customer to present a card and collect the specified amount.

Create a payment intent

createPaymentIntent(deviceId, request) posts a new payment intent to a device. Build the request with PointPaymentIntentRequest.builder():
import com.mercadopago.client.point.PointClient;
import com.mercadopago.client.point.PointPaymentIntentRequest;
import com.mercadopago.client.point.PointPaymentIntentPaymentRequest;
import com.mercadopago.client.point.PointPaymentIntentAdditionalInfoRequest;
import com.mercadopago.resources.point.PointPaymentIntent;
import java.math.BigDecimal;

PointClient client = new PointClient();

PointPaymentIntentRequest request = PointPaymentIntentRequest.builder()
    .amount(new BigDecimal("150.00"))
    .description("Order #4321 — Coffee Shop")
    .payment(PointPaymentIntentPaymentRequest.builder()
        .type("credit_card")
        .installments(3)
        .installmentsCost("seller")
        .build())
    .additionalInfo(PointPaymentIntentAdditionalInfoRequest.builder()
        .externalReference("order-4321")
        .printOnTerminal(true)
        .ticketNumber("TKT-4321")
        .build())
    .build();

PointPaymentIntent intent = client.createPaymentIntent("PAX_A910__SMARTPOS123456", request);

System.out.println("Payment intent ID: " + intent.getId());
System.out.println("Device ID:         " + intent.getDeviceId());
System.out.println("Amount:            " + intent.getAmount());

Payment type reference

typeDescription
credit_cardCredit card — supports installments (1–72) and installmentsCost
debit_cardDebit card — installments not applicable
voucher_cardVoucher/meal card — set voucherType to sodexo or alelo

PointPaymentIntentRequest fields

FieldTypeDescription
amountBigDecimalRequired. Positive amount to charge.
descriptionStringShort description shown on the device display.
paymentPointPaymentIntentPaymentRequestPayment method configuration.
additionalInfoPointPaymentIntentAdditionalInfoRequestOptional metadata and printing preferences.

PointPaymentIntentPaymentRequest fields

FieldTypeDescription
typeStringcredit_card, debit_card, or voucher_card.
installmentsIntegerNumber of installments (1–72). Credit card only.
installmentsCostStringseller or buyer. Credit card only.
voucherTypeStringsodexo or alelo. Voucher card only.

PointPaymentIntentAdditionalInfoRequest fields

FieldTypeDescription
externalReferenceStringYour application’s identifier. Returned in the webhook notification.
printOnTerminalBooleanWhether to print the receipt on the Point device.
ticketNumberStringInvoice or ticket number printed on the receipt.

Get payment intent status

Poll the last status event for a payment intent using getPaymentIntentStatus(paymentIntentId):
import com.mercadopago.client.point.PointClient;
import com.mercadopago.resources.point.PointStatusPaymentIntent;

PointClient client = new PointClient();

PointStatusPaymentIntent status = client.getPaymentIntentStatus("your-payment-intent-id");

System.out.println("Status:     " + status.getStatus());
System.out.println("Created on: " + status.getCreatedOn());
Common status values returned by the API include OPEN, FINISHED, CANCELED, and ERROR.

Search a payment intent by ID

Retrieve the full details of a specific payment intent — including its current lifecycle state — using searchPaymentIntent(paymentIntentId):
import com.mercadopago.client.point.PointClient;
import com.mercadopago.resources.point.PointSearchPaymentIntent;

PointClient client = new PointClient();

PointSearchPaymentIntent found = client.searchPaymentIntent("your-payment-intent-id");

System.out.println("ID:          " + found.getId());
System.out.println("State:       " + found.getState());
System.out.println("Amount:      " + found.getAmount());
System.out.println("Description: " + found.getDescription());
System.out.println("Device:      " + found.getDeviceId());

List payment intents by date range

getPaymentIntentList(request) returns all payment intent events whose final states fall within a given date window:
import com.mercadopago.client.point.PointClient;
import com.mercadopago.client.point.PointPaymentIntentListRequest;
import com.mercadopago.resources.point.PointPaymentIntentList;
import com.mercadopago.resources.point.PointPaymentIntentListEvent;
import java.time.LocalDate;

PointClient client = new PointClient();

PointPaymentIntentListRequest listRequest = PointPaymentIntentListRequest.builder()
    .startDate(LocalDate.of(2024, 1, 1))
    .endDate(LocalDate.of(2024, 1, 31))
    .build();

PointPaymentIntentList list = client.getPaymentIntentList(listRequest);

for (PointPaymentIntentListEvent event : list.getEvents()) {
    System.out.println("Intent ID:  " + event.getPaymentIntentId());
    System.out.println("Status:     " + event.getStatus());
    System.out.println("Created on: " + event.getCreatedOn());
}

Cancel a payment intent

To abort a pending payment intent before the customer interacts with the device, call cancelPaymentIntent(deviceId, paymentIntentId):
import com.mercadopago.client.point.PointClient;
import com.mercadopago.resources.point.PointCancelPaymentIntent;

PointClient client = new PointClient();

PointCancelPaymentIntent cancelled = client.cancelPaymentIntent(
    "PAX_A910__SMARTPOS123456",
    "your-payment-intent-id"
);

System.out.println("Cancelled intent ID: " + cancelled.getId());
Cancellation is only possible while the payment intent is still in the OPEN state. Once the customer has started interacting with the device, the cancellation request will be rejected.

Per-request options

Every PointClient method has an overload that accepts MPRequestOptions as a final argument. Use it to supply a different access token, adjust timeouts, or inject custom headers (such as an idempotency key) for a single call:
import com.mercadopago.core.MPRequestOptions;
import java.util.Map;

MPRequestOptions options = MPRequestOptions.builder()
    .accessToken("APP_USR-token-for-this-call")
    .connectionTimeout(10000)
    .socketTimeout(15000)
    .customHeaders(Map.of("x-idempotency-key", "unique-key-for-this-request"))
    .build();

PointPaymentIntent intent = client.createPaymentIntent(
    "PAX_A910__SMARTPOS123456",
    request,
    options
);

Webhooks and notifications

QR Code notifications are not signed by Mercado Pago. Do not attempt to validate WebhookSignatureValidator against QR events — they will always fail signature verification. Signature validation applies only to standard webhook notifications. See the Webhooks guide for full validation details.
When a payment intent reaches a terminal state, Mercado Pago sends a signed webhook to your configured notification URL. The externalReference field you provided in additionalInfo is included in the payload so you can correlate the notification to your own order or transaction.

Build docs developers (and LLMs) love