Colombia top-ups

Available top-up methods in Colombia: Bancolombia, PSE, Nequi, and Efecty. Endpoints to receive payments and top-ups through Bancolombia, PSE, Nequi, and bank transfer (manual approval flow).

All these endpoints require the x-api-key header for authorization.


Catalogs and estimation

  • Banks by country: GET /banks/ - Query: country (country code, e.g. CO, US).
  • Transfer account: GET /base/transfer_account - Query: country.
  • Estimate top-up: POST /reload/estimate - Body: amount, currency (e.g. COP), by_pse (depending on method).

General flow

Create payer

Register payer data with POST /api/reload/r2p/counterparty/.

Create the payment link based on method: Bancolombia, PSE, or Nequi.

Redirect user

The user completes payment on the banking platform.

Check status

Check payment status with GET /api/reload/r2p/status/{id}/.

Receive confirmation

The system notifies when payment is completed successfully.


Registers the data of the person who will make the payment.

Create Payer

Authorizations

The x-api-key header is required for authorization.

Endpoint

POSThttps://api.colurs.co/api/reload/r2p/counterparty/

Required Headers

Content-Type: application/jsonAccept: application/jsonx-api-key: [API_KEY]

Request Body

FieldTypeRequiredDescription
fullnamestring✓Full payer name
id_typestring✕cc, ce, nit (default: cc)
id_numberstring✓Document number
phonestring✓Phone with country code
emailstring✓Payer email

Response

response.json
{
"id": "cp_vKXigiCryI",
"fullname": "Juan Pérez",
"id_type": "cc",
"id_number": 
"1234567890"}
💡
Save payer `id` to use in the next endpoints.

Generates a payment link for Bancolombia Button.

Bancolombia Button

Authorizations

The x-api-key header is required for authorization.

Endpoint

POSThttps://api.colurs.co/api/reload/r2p/bancolombia/

Required Headers

Content-Type: application/jsonAccept: application/jsonx-api-key: [API_KEY]

Request Body

FieldTypeRequiredDescription
counterparty_idstring✓Created payer ID
amountdecimal✓Amount in COP (minimum 1,000)
external_idstring✓Unique transaction ID
description_to_payerstring✓Customer-facing description (max 255)
description_to_payeestring✓Internal description (max 255)
redirect_urlstring✓Post-payment redirect URL
fee_modestring✕payer or receiver (default: payer)

cURL Example

curl -X POST https://api.colurs.co/api/reload/r2p/bancolombia/ \
-H "Content-Type: application/json" \
-H "x-api-key: [API_KEY]" \
-d '{
  "counterparty_id": "cp_vKXigiCryI",
  "amount": 50000.00,
  "external_id": "ORDER_123456",
  "description_to_payer": "Recarga Colurs - 50,000 COP",
  "description_to_payee": "Recarga de Juan Pérez",
  "redirect_url": "https://app.colurs.co/payment/success",
  "fee_mode": "payer"
}'

Response

response.json
{
"money_movement_id": "mm_gaO1SrCBN92BT5",
"type": "bancolombia",
"status": "initiated",
"payment_link": "https://pago.colurs.co/checkout/_VIwgp1lQI5",
"tracking_key": "917707780",
"amount": 50000.0,
"currency": "COP",
"external_id": "ORDER_123456",
"created_at": "2025-11-14T15:44:39Z",
"fee_breakdown": {
  "reload_amount": "50000.00",
  "fee_colurs": "1000.00",
  "fee_iva": "190.00",
  "total_fee": "1190.00",
  "total_to_pay": "51190.00",
  "fee_mode": "payer",
  "fee_percentage": "2.00",
  "iva_percentage": 
"19.00"}
}
🔗
Redirect the user to `payment_link` to complete payment.

Generates a payment link for PSE.

PSE

Authorizations

The x-api-key header is required for authorization.

Endpoint

POSThttps://api.colurs.co/api/reload/r2p/pse/

Required Headers

Content-Type: application/jsonAccept: application/jsonx-api-key: [API_KEY]

Request Body

FieldTypeRequiredDescription
counterparty_idstring✓Payer ID
amount_copdecimal✓Amount in COP
external_idstring✓Unique transaction ID
description_to_payerstring✓Customer-facing description
description_to_payeestring✓Internal description
redirect_urlstring✓Redirect URL
financial_institution_codestring✓PSE bank code
fee_modestring✕payer or receiver

Response

response.json
{
"money_movement_id": "mm_tjfcYXguVwrNWj",
"type": "pse",
"status": "initiated",
"payment_link": "https://pago.colurs.co/pse/mm_tjfcYXguVwrNWj",
"tracking_key": "PSE_917707781",
"amount": 100000.0,
"currency": "COP",
"external_id": "ORDER_123457",
"financial_institution_code": "1007",
"created_at": "2025-11-14T15:44:40Z",
"fee_breakdown": {
  "reload_amount": "100000.00",
  "fee_colurs": "2000.00",
  "fee_iva": "380.00",
  "total_fee": "2380.00",
  "total_to_pay": "102380.00",
  "fee_mode": "payer",
  "fee_percentage": "2.00",
  "iva_percentage": 
"19.00"}
}

Generates a payment request for Nequi.

Nequi

Authorizations

The x-api-key header is required for authorization.

Endpoint

POSThttps://api.colurs.co/api/reload/r2p/nequi/

Required Headers

Content-Type: application/jsonAccept: application/jsonx-api-key: [API_KEY]

Request Body

FieldTypeRequiredDescription
counterparty_idstring✓Payer ID
amountdecimal✓Amount in COP
external_idstring✓Unique transaction ID
description_to_payerstring✓Customer-facing description
description_to_payeestring✓Internal description
redirect_urlstring✓Redirect URL
fee_modestring✕payer or receiver

Response

response.json
{
"money_movement_id": "mm_abc123def456",
"type": "nequi",
"status": "initiated",
"payment_link": null,
"tracking_key": "NEQUI_12345",
"amount": 25000.0,
"currency": "COP",
"external_id": "ORDER_123458",
"created_at": "2025-11-14T15:44:41Z",
"note": "User must complete payment from the Nequi app",
"fee_breakdown": {
  "reload_amount": "25000.00",
  "fee_colurs": "500.00",
  "fee_iva": "95.00",
  "total_fee": "595.00",
  "total_to_pay": "25595.00",
  "fee_mode": 
"payer"}
}
📱
**Important:** Nequi does NOT generate a `payment_link`. The user must complete payment from their Nequi app using `tracking_key`.

Bank transfer top-up (BANK_TRANSFER)

Manual top-up method: the user uploads bank transfer evidence and an operator reviews it and approves or rejects crediting balance. Unlike Bancolombia, PSE, and Nequi, there is no automatic webhook.

👤

Approval or rejection is done from the operator panel (POST /panel/reload/). Only superusers or operators can use that endpoint.

Flow

User creates top-up

Send POST /reload/create with reload_method: BANK_TRANSFER, amount, currency, evidence (proof URL), source bank, and destination bank.

Backend creates record

The top-up stays in Created state (pending approval). Fees are calculated at creation.

Operator reviews evidence

From the panel, the operator reviews evidence (image or PDF).

Operator approves or rejects

POST /panel/reload with reload_id and status: APPROVED or REJECTED.

If approved

The system credits user balance, records fees (Colurs, VAT), and referral commission if applicable.


Step 1: Create top-up with evidence (user)

The user indicates they made a bank transfer top-up and attaches the evidence URL.

Create BANK_TRANSFER top-up

Authorizations

Both x-api-key and Authorization: Bearer <token> headers are required.

Endpoint

POSThttps://api.colurs.co/reload/create

Required Headers

Content-Type: application/jsonAccept: application/jsonx-api-key: [API_KEY]Authorization: Bearer [ACCESS_TOKEN]

Request Body

FieldTypeRequiredDescription
reload_methodstring✓BANK_TRANSFER
currencystring✓COP or USD
amountdecimal✓Top-up amount (up to 20 digits, 2 decimals)
evidencestring✓Evidence URL (image or PDF)
bank_idint✓Source bank ID
target_bank_idint✓Destination bank ID (Colurs account)
ipstring✓Client IP
latitudestring✓Latitude GPS
longitudestring✓Longitude GPS
payer_emailstring✕Payer email
payer_phonestring✕Payer phone
payer_type_documentstring✕CC, CE, TI, NIT, etc.
payer_documentstring✕Document number
account_namestring✕Source account name

cURL Example

curl -X POST "https://api.colurs.co/reload/create" \
-H "Authorization: Bearer [TOKEN]" \
-H "x-api-key: [API_KEY]" \
-H "Content-Type: application/json" \
-d '{
  "reload_method": "BANK_TRANSFER",
  "currency": "COP",
  "amount": 500000,
  "evidence": "https://storage.colurs.co/evidence/recarga-123.pdf",
  "bank_id": 1,
  "target_bank_id": 2,
  "ip": "192.168.1.1",
  "latitude": "4.60971",
  "longitude": "-74.08175"
}'

Response

response.json
{
"message": "OK",
"data": {
  "id": 316,
  "state": "Creado",
  "owner": "colurs@colurs.io",
  "reload_method": "BANK_TRANSFER",
  "currency": "COP",
  "bank_name": "BANCO_BAN100",
  "transfer_account": "BANCO_BBVA",
  "payed_amount": "989.00",
  "evidence": "url-to-evidence",
  "ip": "192.168.1.1",
  "latitude": "4.60971",
  "longitude": "-74.08175",
  "checkout": null
}
}
📎
`evidence` must be an accessible **URL** to payment proof (image or PDF uploaded to your storage).

The top-up remains in Created status until an operator approves or rejects it.


Modos de Fee

The system supports two fee charging modes:

ModeDescriptionExample (amount: $50,000, fee: $1,190)
payerUser pays amount + feesUser pays: $51,190 -> Credited: $50,000
receiverUser pays only amountUser pays: $50,000 -> Credited: $48,810

Fees are calculated automatically based on profile configuration (CustomFees) or global fees.


Common errors

CodeErrorDescription
400Validation failedInvalid request data
404Not foundMoney Movement does not exist
500Internal errorProcessing error