PSE Payments

pse logo

Accept payments through PSE, Colombia's real-time online bank transfer method. The buyer selects their bank, is redirected to the PSE/bank portal, and authorizes the debit there. You integrate only with the Getnet Web Checkout API, which orchestrates the bank selection and redirect.

This guide shows you how to create a payment intent for PSE. It also covers what happens during the bank redirect and how to resolve the final status asynchronously.

This document applies to the following country:

Colombia

How It Works

Use PSE to reach banked customers in Colombia who don't pay with a card. You need only a single integration with Web Checkout. Its key characteristics are:

  • Bank debit: the buyer pays from their own bank account.
  • Single integration: you integrate only with Web Checkout. Web Checkout looks up the available banks and displays the bank list in the checkout. It then uses the returned redirect_url to send the buyer to the bank.
  • Asynchronous: the payment stays in PENDING until the buyer authorizes the debit at their bank. Web Checkout then confirms it as approved or declined. You receive the final status through a webhook or by querying GET /payment-intent/{id}.
  • No refunds: PSE does not support total or partial refunds.

The end-to-end flow involves the buyer, your backend, the Getnet Web Checkout API, and SEP:

Before You Start

Make sure the following are in place before you integrate:

  • The seller has PSE enabled in the Web Checkout configuration.
  • You have generated your token as described in the Authentication document.
  • Your payments are in Colombian pesos (COP).

Step 1: Create the Payment Intent

Call the Web Checkout API to create a payment intent.

Endpoint
POST /payment-intent
Required fields
FieldTypeDescriptionExample
order_idstringUnique order reference defined by the merchant.ORDER_PSE_97531
payment.currencystringCurrency code. Must be COP for PSE.COP
payment.amountintegerPurchase amount in integer format, in cents.400
customer.emailstringCustomer's email address. Required for PSE (KYC).customer@email.com
customer.document_typestringCustomer's document type (for example, CC or NIT). Required for PSE (KYC).NIT
customer.document_numberstringCustomer's document number. Required for PSE (KYC).50506468
Optional fields
FieldTypeDescriptionExample
configurations.3dsbooleanControls 3D Secure authentication. Does not apply to PSE.false
configurations.preauthorizationbooleanIndicates if the payment is a pre-authorization. Does not apply to PSE.false
configurations.card_verificationbooleanIndicates if this is a card verification flow. Does not apply to PSE.false
configurations.success_urlstringRedirect URL in case of successful payment. Overrides the seller configuration.https://www.mystore.com/checkout/success
configurations.error_urlstringRedirect URL in case of an error during payment. Overrides the seller configuration.https://www.mystore.com/checkout/error
product[].product_typestringProduct type.service
product[].titlestringProduct title.Suscripción mensual
product[].descriptionstringProduct description.Plan Pro - 1 mes
product[].valueintegerProduct value. Must match payment.amount.400
product[].quantityintegerProduct quantity.1
customer.customer_idstringCustomer identifier.customer_co_005
customer.first_namestringCustomer's first name.Jose
customer.last_namestringCustomer's last name.da Silva
customer.namestringCustomer's full name.Jose da Silva
customer.phone_numberstringCustomer's phone number.573001234567
customer.checked_emailbooleanIndicates whether the customer's email has been verified.true
customer.billing_address.streetstringName of a street.Avenida Siempre Viva
customer.billing_address.numberstringNumber that identifies the position of a building on a street.123
customer.billing_address.complementstringAddress complement.Apto 601
customer.billing_address.districtstringDistrict or neighborhood.Centro
customer.billing_address.citystringCity.Bogota
customer.billing_address.statestringState or department.DC
customer.billing_address.countrystringCountry code.CO
customer.billing_address.postal_codestringPostal or ZIP code.110111
soft_descriptorstringPayment description that appears on the customer's receipt.Tienda CO
expires_atstringPayment intent expiration. If omitted, the payment intent does not expire.1h

Example Request

The following example creates a PSE payment intent for a customer in Colombia.

JSON
{ "mode": "instant", "order_id": "ORDER_CO_PSE_001", "payment": { "currency": "COP", "amount": 5200 }, "product": [ { "product_type": "physical_goods", "title": "Zapatillas deportivas", "description": "Zapatillas Adidas Ultraboost", "value": 5200, "quantity": 1 } ], "customer": { "customer_id": "customer_co_001", "first_name": "Laura", "last_name": "Gómez", "name": "Laura Gómez", "email": "laura@example.co", "document_type": "CC", "document_number": "1032456789", "phone_number": "573001234567", "checked_email": true, "billing_address": { "street": "Carrera 7", "number": "72-41", "city": "Bogotá", "state": "Cundinamarca", "country": "CO", "postal_code": "110221" } }, "pickup_store": false, "configurations": { "success_url": "https://store.example.co/checkout/success", "error_url": "https://store.example.co/checkout/error" } }

Example 200/201 Response

A successful request returns the payment intent ID, the trade name and the redirect URL for the checkout.

JSON
{ "payment_intent_id": "d4fb9559-09f3-43ac-8ba5-c0d786506ea9", "trade_name": "Tienda Colombiana", "redirect_url": "https://www.globalgetnet.com/hosted-web-checkout/eyJraWQiOi..." }

Step 2: Let the Buyer Select the Bank and Authorize the Payment

You don't send any additional request in this step. Web Checkout handles the PSE flow with SEP:

  1. Web Checkout queries the available banks at SEP (bank lookup) and shows the bank list in the checkout.
  2. The buyer chooses PSE as the payment method and selects their bank.
  3. Web Checkout sends the operation to SEP and receives a redirect_url.
  4. Web Checkout redirects the buyer to the PSE / bank portal, where the buyer authorizes the debit.
  5. The checkout shows a waiting screen while the payment is processed asynchronously.

If the buyer does not authorize the payment or closes the browser, don't rely on the redirect. Use the webhook to get the final status.

Step 3: Confirm the Result

PSE is asynchronous. The payment stays in PENDING until the buyer authorizes the debit at their bank and SEP confirms it. Resolve the final status in one of two ways:
  • Webhook: receive the approved or denied notification (see payloads below).
  • Query: call GET /payment-intent/{id} to check the current status.
We recommend validating every webhook against GET /payment-intent/{id}.

Example Response — Pending/Waiting

The following payload shows a pending payment, with the result status Registered and the PSE status Pending.
JSON
{ "payment_intent_id": "d4fb9559-09f3-43ac-8ba5-c0d786506ea9", "checkout_id": "7db15d1e-ea8b-4560-84d2-fb3d02179539", "order_id": "ORDER_CO_PSE_001", "mode": "instant", "seller": { "id": "d9c99f03-025c-4251-a9f5-de73ef593523", "trade_name": "Tienda Colombiana", "merchant_document": "900123456", "settings": { "notification_url_configured": true } }, "payment": { "method": "pse", "amount": 5200, "currency": "COP", "result": { "payment_id": "2e0b7dd5-92da-4ef4-ad3b-0ba369ad0ef1", "status": "Registered", "pse": { "payment_id": "2e0b7dd5-92da-4ef4-ad3b-0ba369ad0ef1", "status": "Pending", "redirect_url": "https://payments.example.co/pse" }, "redirect_url": "https://payments.example.co/pse" } } }

Example Response — Approved

The following webhook payload shows an approved payment, with the result status Authorized.
JSON
{ "payment_intent_id": "d4fb9559-09f3-43ac-8ba5-c0d786506ea9", "checkout_id": "7db15d1e-ea8b-4560-84d2-fb3d02179539", "order_id": "ORDER_CO_PSE_001", "mode": "instant", "seller": { "id": "d9c99f03-025c-4251-a9f5-de73ef593523", "trade_name": "Tienda Colombiana", "merchant_document": "900123456", "settings": { "notification_url_configured": true } }, "payment": { "method": "pse", "amount": 5200, "currency": "COP", "result": { "payment_id": "2e0b7dd5-92da-4ef4-ad3b-0ba369ad0ef1", "status": "Authorized", "pse": { "payment_id": "2e0b7dd5-92da-4ef4-ad3b-0ba369ad0ef1", "status": "Authorized", "redirect_url": "https://payments.example.co/pse" }, "redirect_url": "https://payments.example.co/pse" } } }

Example Response — Denied

The following webhook payload shows a denied payment. In this example, the bank did not authorize the transaction.

JSON
{ "payment_intent_id": "1f9f47ed-65cc-4fbf-a407-0f17df9a2e2c", "checkout_id": "5ab15d1e-ea8b-4560-84d2-fb3d02179537", "order_id": "ORDER_PSE_97531", "mode": "instant", "payment": { "method": "pse", "amount": 400, "currency": "COP", "result": { "payment_id": "47b9163c-64f3-41d1-8bd2-69512b9c1419", "status": "Denied", "transaction_datetime": "2026-07-08T12:03:00.000Z", "return_message": "Transaction not authorized by the bank" } }, "created_at": "2026-07-08T11:58:00.000Z", "updated_at": "2026-07-08T12:03:00.000Z" }

PSE Status Values

For PSE, the expected flow is PENDING → AUTHORIZED or DECLINED. Web Checkout confirms the final status and notifies you through the webhook.

Your webhook must be idempotent and handle duplicate notifications. Release the order only after the payment is approved.

Refunds

PSE does not support refunds, either total or partial.