Payment Links

Generate custom payment links to charge third parties without technical integration.

Payment Links allow you to receive payments without requiring technical integration from the payer.


Generate a Payment Link with fixed or variable amount.

Send the URL to the payer by email, WhatsApp, etc.

Payer completes payment

The payer selects payment method and completes the transaction.

Receive notification

The system updates status to PAID and credits balance.


Generate a new payment link.

Create Payment Link

Authorizations

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

Endpoint

POSThttps://dev.backend.colurs.co/payment-links

Required Headers

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

Request Body

FieldTypeRequiredDescription
currencystringβœ“COP, USD
amountdecimal⚠Fixed amount (required if is_general=false)
is_generalbooleanβœ“true = variable amount, false = fixed amount
descriptionstringβœ•Payment description
fee_modestringβœ•payer or receiver
expires_atdatetimeβœ•Link expiration date

Response

response.json
{
"id": 123,
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"owner": {
  "username": "user",
  "email": 
"user@example.com"},
"currency": "COP",
"amount": 50000.0,
"colurs_fee_amount": 1000.0,
"colurs_iva_amount": 190.0,
"total_to_pay": 51190.0,
"status": "PENDING",
"expires_at": "2026-03-03T00:00:00Z",
"link_url": "https://colurs.me/pay/550e8400-e29b-41d4-a716-446655440000",
"allowed_methods": ["BANCOLOMBIA", "PSE", "NEQUI"],
"description": "Service payment",
"created_at": 
"2026-02-03T10:00:00Z"}
⚠️
For fixed amount links (`is_general=false`): amount must be greater than configured minimum and cannot be negative.
πŸ”—
Share `link_url` with the payer so they can complete payment.

Payment method options

Authorizations

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

Endpoint

GET/payment-links/methods/options

Required Headers

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

Response

response.json
{
"PSE": true,
"CARD": true,
"BREB": false,
"UMA": false,
"BANCOLOMBIA": true,
"NEQUI": true
}

Customize methods for a link

Authorizations

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

Endpoint

PATCH/payment-links/{link_uuid}/custom

Required Headers

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

Request Body

FieldTypeRequiredDescription
allowed_methodsobjectβœ“Keys: PSE, CARD, BREB, UMA, BANCOLOMBIA, NEQUI (boolean each)

Response

response.json
{
"id": 123,
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"allowed_methods": { "PSE": true, "BANCOLOMBIA": true, "NEQUI": false }
}

Fee modes

The system supports two modes for charging fees:

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 according to profile configuration (CustomFees) or global fees.


Deposit / pay a Payment Link

Authorizations

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

Endpoint

POST/payment-links/{uuid}/deposit

Required Headers

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

Request Body

FieldTypeRequiredDescription
amountnumberβœ“Amount to pay
payment_methodstringβœ“BANCOLOMBIA, PSE, NEQUI, etc.
payer_dataobjectβœ•Payer data according to method

Response

response.json
{
"status": "PENDING",
"checkout_url": "https://checkout.colurs.me/...",
"amount": 51190.0
}

StatusIconDescription
PENDING⏳Created, waiting payment
ACTIVEπŸ”„Payment in progress
PAIDβœ…Payment completed
EXPIREDβŒ›Link expired
CANCELLED❌Link canceled

Available payment methods

MethodDescriptionGenerates link
BANCOLOMBIABancolombia Buttonβœ…
PSEOnline secure paymentsβœ…
NEQUIPayment from Nequi app❌

Get a Payment Link

Authorizations

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

Endpoint

GET/payment-links/{link_uuid}/custom

Required Headers

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

Response

response.json
{
"id": 123,
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"owner": { "username": "user", "email":  "user@example.com"},
"currency": "COP",
"amount": 50000.0,
"status": "PENDING",
"link_url": "https://colurs.me/pay/550e8400-e29b-41d4-a716-446655440000",
"allowed_methods": ["BANCOLOMBIA", "PSE", "NEQUI"]
}

General link by user

Authorizations

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

Endpoint

GET/payment-links/{user_reference}/general

Required Headers

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

Response

response.json
{
"id": 456,
"uuid": "...",
"currency": "COP",
"is_general": true,
"link_url": 
"https://colurs.me/pay/..."}

Full example

curl -X POST https://api.colurs.co/payment-links \
  -H "Authorization: Bearer [TOKEN]" \
  -H "x-api-key: [API_KEY]" \
  -H "Content-Type: application/json" \
  -d '{
    "currency": "COP",
    "amount": 100000,
    "is_general": false,
    "description": "Monthly payment",
    "fee_mode": "payer"
}'

2. Share the URL

Send returned link_url to payer (e.g. https://colurs.me/pay/550e8400-e29b-41d4-a716-446655440000).

3. Payer completes payment

Payer uses POST /payment-links/{uuid}/deposit or completes flow at link URL.

curl -X GET "https://api.colurs.co/payment-links/550e8400-e29b-41d4-a716-446655440000/custom" \
  -H "Authorization: Bearer [TOKEN]" \
  -H "x-api-key: [API_KEY]"

5. Payment confirmed

When status becomes PAID, balance is credited automatically.


Common errors

CodeErrorDescription
400AmountRequiredAmount required for general links
400AmountMismatchAmount does not match link amount
400InvalidStatusLink is not in a valid status for payment
404NotFoundPayment Link does not exist