PSE Payments
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_urlto send the buyer to the bank. - Asynchronous: the payment stays in
PENDINGuntil 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 queryingGET /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 |
| Field | Type | Description | Example |
|---|---|---|---|
order_id | string | Unique order reference defined by the merchant. | ORDER_PSE_97531 |
payment.currency | string | Currency code. Must be COP for PSE. | COP |
payment.amount | integer | Purchase amount in integer format, in cents. | 400 |
customer.email | string | Customer's email address. Required for PSE (KYC). | customer@email.com |
customer.document_type | string | Customer's document type (for example, CC or NIT). Required for PSE (KYC). | NIT |
customer.document_number | string | Customer's document number. Required for PSE (KYC). | 50506468 |
| Field | Type | Description | Example |
|---|---|---|---|
configurations.3ds | boolean | Controls 3D Secure authentication. Does not apply to PSE. | false |
configurations.preauthorization | boolean | Indicates if the payment is a pre-authorization. Does not apply to PSE. | false |
configurations.card_verification | boolean | Indicates if this is a card verification flow. Does not apply to PSE. | false |
configurations.success_url | string | Redirect URL in case of successful payment. Overrides the seller configuration. | https://www.mystore.com/checkout/success |
configurations.error_url | string | Redirect URL in case of an error during payment. Overrides the seller configuration. | https://www.mystore.com/checkout/error |
product[].product_type | string | Product type. | service |
product[].title | string | Product title. | Suscripción mensual |
product[].description | string | Product description. | Plan Pro - 1 mes |
product[].value | integer | Product value. Must match payment.amount. | 400 |
product[].quantity | integer | Product quantity. | 1 |
customer.customer_id | string | Customer identifier. | customer_co_005 |
customer.first_name | string | Customer's first name. | Jose |
customer.last_name | string | Customer's last name. | da Silva |
customer.name | string | Customer's full name. | Jose da Silva |
customer.phone_number | string | Customer's phone number. | 573001234567 |
customer.checked_email | boolean | Indicates whether the customer's email has been verified. | true |
customer.billing_address.street | string | Name of a street. | Avenida Siempre Viva |
customer.billing_address.number | string | Number that identifies the position of a building on a street. | 123 |
customer.billing_address.complement | string | Address complement. | Apto 601 |
customer.billing_address.district | string | District or neighborhood. | Centro |
customer.billing_address.city | string | City. | Bogota |
customer.billing_address.state | string | State or department. | DC |
customer.billing_address.country | string | Country code. | CO |
customer.billing_address.postal_code | string | Postal or ZIP code. | 110111 |
soft_descriptor | string | Payment description that appears on the customer's receipt. | Tienda CO |
expires_at | string | Payment 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.
Example 200/201 Response
A successful request returns the payment intent ID, the trade name and the redirect URL for the checkout.
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:
- Web Checkout queries the available banks at SEP (bank lookup) and shows the bank list in the checkout.
- The buyer chooses PSE as the payment method and selects their bank.
- Web Checkout sends the operation to SEP and receives a
redirect_url. - Web Checkout redirects the buyer to the PSE / bank portal, where the buyer authorizes the debit.
- 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
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.
GET /payment-intent/{id}.Example Response — Pending/Waiting
Registered and the PSE status Pending.Example Response — Approved
Authorized.Example Response — Denied
The following webhook payload shows a denied payment. In this example, the bank did not authorize the transaction.
PSE Status Values
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.
On this page