Skip to main content
Use rail: "PSE" when you want the payer to authenticate the payment with a supported Colombian bank through the PSE flow. Before implementing this rail:
  • Review How to create your first payin for the shared request fields and lifecycle.
  • Configure webhooks to receive the final payin outcome asynchronously.
  • Treat callbackUrl as the payer return URL, not as the source of truth for payment confirmation.

How the PSE flow works

  1. Create the payin with rail: "PSE" and include the selected bank in pse.bank.
  2. HelloPay starts the payin in PROCESSING.
  3. Right after creation, sourceData.pseUrl is null.
  4. Poll the payin until HelloPay updates sourceData.pseUrl with the redirect URL for the payer.
  5. The payer completes the authorization through the PSE bank flow.
  6. HelloPay sends webhook events such as payin.confirmed, payin.canceled, or payin.declined.
  7. After the payer finishes the flow, HelloPay redirects them to your callbackUrl.

Request example

This flow is asynchronous. After creating the payin, sourceData.pseUrl is initially null, so you must poll the transaction until the redirect URL is available.

Request fields

  • amountInCents: amount to collect, expressed in cents.
  • currency: currently COP.
  • rail: must be PSE.
  • reference: your internal identifier for this payin.
  • inlineCustomer: customer information used during the payment flow. Supported document types are listed in How to create your first payin.
  • pse.bank: bank selected by the payer from the supported PSE bank list.
  • pse.personType: payer type. Supported values are INDIVIDUAL and BUSINESS.
  • callbackUrl: URL where the payer is redirected after leaving the PSE flow.

Supported banks

Use one of the following values in pse.bank:

Supported person types

Use one of the following values in pse.personType:

Response example

What the response means

  • status: "PROCESSING" means the payin was created and is waiting for the payer to complete the PSE flow.
  • sourceData.pseUrl is null in the creation response and is filled later when you poll the payin again.
  • sourceData also includes the PSE-specific data associated with the payin, such as the selected bank and person type.
  • The final outcome is delivered asynchronously through webhooks, so do not treat the creation response as the final payment result.