Getnet DocsGetnet Docs

Create Card Present QR Code Payments (Account-to-Account)

This guide walks you through processing an account-to-account QR Code payment in a Card Present (CP) environment using the Getnet Regional API. In this flow, the merchant’s physical terminal requests a dynamic EMV QR code from the gateway, displays it to the customer, and the customer scans it with their banking app to authorize the payment directly from their bank account.

This is not Pix.** The QR Code flow described here is an account-to-account payment method processed through the Visa/Mastercard networks. It is currently available for Chile only. Support for additional countries (Argentina via Transferencia 3.1, Brazil via Pix) will be added in future releases.

Requirements

Before initiating a QR code request, ensure the following:

  • API Credentials: Obtain your client_id and client_secret from the Integration Support team.
  • Authentication: Generate a Bearer token via the Authentication endpoint.
  • Terminal Hardware: A physical device (POS/TEF) capable of displaying images or high-resolution text for QR code rendering.
  • Serial Number: The physical serial_number of the device must be provided in every request.
  • Brand Support: Currently available exclusively for Visa and Mastercard.

How It Works

The Card Present QR Code flow has three stages:

StageActorAction
1. GenerateTerminal → APIThe terminal sends a POST request to the QR Code endpoint and receives an EMV QR payload (HTTP 201).
2. DisplayTerminal → CustomerThe terminal renders the QR string as a scannable image on its screen. The customer scans it with their banking app.
3. ConfirmAPI → TerminalThe payment is authorized asynchronously. The terminal confirms the final status via webhooks or the Get Transaction endpoint.

Expiration: QR codes generated via this endpoint expire after 1 minute and 50 seconds. If the customer does not scan and authorize within this window, discard the code and generate a new one.

QR Code Payment Process

Step 1: Create the QR Code Request

Send a POST request to the QR Code endpoint to generate the EMV QR payload.

Request Fields

FieldTypeConstraintsDescriptionRequired
idempotency_keyString1–64 chars, alphanumeric + .-_Unique key to prevent duplicate requests.Yes
request_idString (UUID)36 charsUnique identifier for this request.Yes
order_idString1–36 charsYour internal order reference.Yes
amountIntegerIn centsTransaction amount (e.g., 10000 = 100.00).Yes
currencyStringISO 4217Currency code (e.g., CLP).Yes
payment_methodEnumPURCHASE, INVOICE, COLLECTIONThe type of payment operation.Yes
transaction_typeEnumNO_INTEREST, WITH_INTERESTWhether installment interest applies.Yes
serial_numberString—Unique serial number of the physical terminal.Yes
payment_idString (UUID)36 charsOptional payment identifier if pre-assigned.No
additional_data.fee.range_acquirerString—Acquirer fee range code.No
additional_data.fee.range_issuerString—Issuer fee range code.No

Example Request

curl --location --request POST 'https://api.pre.globalgetnet.com/dpm/payments-gwproxy/v2/payments/qrcode' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer <ACCESS_TOKEN>' \
--header 'x-transaction-channel-entry: XX' \
--data-raw '{
  "idempotency_key": "cp-qr-visa-001",
  "request_id": "daac03dc-73db-453f-9bea-b1391669d5d3",
  "order_id": "ORDER-101",
  "amount": 10000,
  "currency": "CLP",
  "payment_method": "PURCHASE",
  "transaction_type": "NO_INTEREST",
  "serial_number": "CL00027L"
}'

Step 2: Display the QR Code

A successful request returns HTTP 201 with a JSON body containing the qr_code EMV string inside additional_data. Render this string as a scannable image on the terminal screen.

Response Fields

FieldTypeDescription
payment_idString (UUID)Unique identifier for this payment. Use this to poll the final status.
seller_idString (UUID)Identifier of the seller account.
request_idString (UUID)Echoes the request_id sent in the request.
idempotency_keyStringEchoes the idempotency_key sent in the request.
order_idStringEchoes the order_id sent in the request.
amountIntegerTransaction amount in cents.
currencyStringISO 4217 currency code.
statusEnumResult of QR code generation: APPROVED, DENIED, ERROR, or ACCEPTED.
reason_codeString (2 chars)Return code from the gateway or acquirer.
reason_messageStringHuman-readable return message from the gateway.
additional_data.transaction_idStringTransaction identifier generated by the gateway.
additional_data.creation_date_qrcodeString (ISO 8601)Timestamp when the QR code was created.
additional_data.expiration_date_qrcodeString (ISO 8601)Timestamp when the QR code expires (110 seconds after creation).
additional_data.qr_codeStringThe EMV QR code string to render as a scannable image.
additional_data.qr_code_emv_typeEnumQR code type: static or dynamic.
additional_data.third_party_qr_code_idStringQR code identifier generated by the third-party provider.
additional_data.third_party_order_idStringOrder identifier generated by the third-party provider.

Example Response (HTTP 201)

{
  "payment_id": "03ec0ede-3bc9-42dd-a71b-1c3a670b2b89",
  "seller_id": "e0ed6f00-fdc5-46d6-9557-6a2cac641b09",
  "request_id": "daac03dc-73db-453f-9bea-b1391669d5d3",
  "idempotency_key": "cp-qr-visa-001",
  "order_id": "ORDER-101",
  "amount": 10000,
  "currency": "CLP",
  "status": "APPROVED",
  "reason_code": "00",
  "reason_message": "TRANSACTION EXECUTED SUCCESSFULLY",
  "additional_data": {
    "transaction_id": "890005df15a2-0b1e-4c6e-8ece",
    "qr_code": "00020101021241260009cl.getnet98097605970315204...",
    "qr_code_emv_type": "dynamic",
    "creation_date_qrcode": "2026-02-19T14:48:00.000Z",
    "expiration_date_qrcode": "2026-02-19T14:49:50.000Z",
    "third_party_qr_code_id": "61260970G",
    "third_party_order_id": "61260970G"
  }
}

status: "APPROVED" means the QR code was successfully generated — it does not indicate that the customer has paid. You must verify the actual fund-transfer status separately using the payment_id.

To process the response:

  1. Extract additional_data.qr_code and render it as a scannable QR image on the POS screen.
  2. Start a countdown timer using expiration_date_qrcode to auto-discard expired codes.
  3. Store the payment_id to query the final authorization status in Step 3.

Step 3: Verify the Transaction Status

After the customer scans the QR code, verify that the payment was completed using one of these methods:

  • Webhooks: Configure your integration to receive asynchronous payment status notifications.
  • Polling: Call the Get Transaction endpoint with the payment_id returned in Step 2.

Error Responses

HTTP StatusDescription
400 Bad RequestMalformed request or missing required fields.
401 UnauthorizedInvalid or expired Bearer token.
404 Not FoundReferenced resource not found.
422 Unprocessable EntityRequest was well-formed but failed business logic validation.
429 Too Many RequestsRate limit exceeded.
500 Internal Server ErrorUnexpected error on the server.
503 Service UnavailableService temporarily unavailable.
504 Gateway TimeoutGateway did not receive a timely response.

Next Steps

Now that you understand QR Code payments, explore these related Card Present features: