User-to-user transfer

Transfer balance instantly between Colurs user wallets.

All endpoints require authentication with Authorization: Bearer [TOKEN] and x-api-key.


Overview

Transfer types

TypeDescription
Standard SendTransfer by recipient username. Full validations (KYC, balance, limits).
Fast SendTransfer by user ID. Option to estimate costs beforehand. Channels with or without fees.
Multiple sendEstimate costs to send to multiple recipients at once.

Standard send

Create a transfer by specifying the recipient username. The system validates KYC, sufficient balance, and limits (for COP).

Flow

Validate recipient

Recipient is identified by to_user (username). Must exist and be active.

Create transfer

POST /send/ with amount, currency, and optional description.

Internal process

(amount + fees) is debited from sender, amount is credited to recipient, balance limit is updated when applicable, and a notification is sent.


Estimate transfer (preview)

Authorizations

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

Endpoint

POSThttps://dev.backend.colurs.co/send/estimate/user/

Required Headers

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

Request Body

FieldTypeRequiredDescription
amountstringβœ“Amount
currencystringβœ“COP, USD
to_userstringβœ“Email or 10-digit phone
send_channelstringβœ“COLURS
ipstringβœ•Client IP
latitudestringβœ•Latitude
longitudestringβœ•Longitude
is_for_quotebooleanβœ•false

Create transfer to Colurs user

Authorizations

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

Endpoint

POSThttps://dev.backend.colurs.co/send/user/

Required Headers

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

Request Body

FieldTypeRequiredDescription
amountstringβœ“Amount
currencystringβœ“COP, USD
to_userstringβœ“Recipient username
send_channelstringβœ“COLURS
ipstringβœ•IP
latitudestringβœ•Latitude
longitudestringβœ•Longitude
is_for_quotebooleanβœ•false

Response

response.json
{
"to_user": "+573001234567",
"from_user": "+573009876543",
"created": true,
"pk": 12345,
"date": "2026-02-03T10:00:00Z",
"amount": 50000.00
}

Possible Errors

CodeErrorDescription
403User blocked / no KYCUser blocked for transfers or without KYC verification
404Profile does not existSource or destination profile does not exist
400BALANCE_INSUFFICIENTInsufficient balance
400LIMIT_BALANCERecipient exceeds balance limit
400USER_DOES_NOT_SAMESelf-transfer attempt
400AMOUNT_NOT_ZEROAmount must be greater than 0
400OPERATION_INVALIDOperation not allowed
400UNABLE_TO_CREATE_SENDFailed to create transfer
**Validations:** Active sender user, existing profiles, completed KYC, amount greater than 0, sufficient balance, for COP recipient balance limit, no self-transfer.

Last users sent to

Last users sent to

Authorizations

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

Endpoint

GEThttps://dev.backend.colurs.co/send/last_users_sended/

Required Headers

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

Request Body

FieldTypeRequiredDescription
limitnumberβœ•Ej. 5
type_sendstringβœ•Ej. colurs

Response

response.json
{
"to_user": "+573001234567",
"from_user": "+573009876543",
"created": true,
"pk": 12345,
"date": "2026-02-03T10:00:00Z",
"amount": 50000.00
}

Send to bank account (withdrawal)

Estimate: POST /send/estimate/user/ with send_channel: β€œDALE”, amount, currency, ip, latitude, longitude, is_for_quote: false. Execute: POST /create/third_party_withdraw/ (see Bank withdrawals).

Send USD (deposit)

Start: POST /usd/owner/payment - Body: deposit_option, currency (USD), amount, ip, latitude, longitude. Confirm: POST /usd/user/deposit - Body: check_id, account_id, withdraw_id. List accounts: GET /usd/user/account.

List transfers

Authorizations

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

Endpoint

GEThttps://dev.backend.colurs.co/send/

Required Headers

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

Response

response.json
Transfer list (format according to ListSend serializer).

Fast Send

Transfer by user ID with option to estimate costs before execution. Supports channels with and without fees.

Transfer channels

ChannelDescription
COLURSTransfer between Colurs users. No fee (fee = 0).
DALETransfer with applicable fees. For COP, may include GMF (financial transaction tax).

Estimate Fast Send

Authorizations

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

Endpoint

POSThttps://dev.backend.colurs.co/send/estimate/user/

Required Headers

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

Request Body

FieldTypeRequiredDescription
amountdecimalβœ“Amount to send
currencystringβœ“COP, USD
to_userintβœ•Recipient user ID (optional)
send_channelstringβœ“COLURS or DALE
is_for_quotebooleanβœ“true for quote only, false to execute later

cURL Example

curl -X POST "https://dev.backend.colurs.co/send/estimate/user/" \
-H "Authorization: Bearer [TOKEN]" \
-H "x-api-key: [API_KEY]" \
-H "Content-Type: application/json" \
-d '{
  "amount": 50000,
  "currency": "COP",
  "send_channel": "COLURS",
  "is_for_quote": true
}'

Response

response.json
{
"result": {
  "amount": 50000.00,
  "fee_amount": 1000.00,
  "fee_iva_amount": 190.00,
  "payed_amount": 51190.00,
  "gmf_amount": 200.00,
  "full_name": 
"Juan PΓ©rez"}
}

For **COLURS** channel: fee_amount and fee_iva_amount are 0, payed_amount = amount. For COP in other channels, gmf_amount may apply.


Execute Fast Send

Authorizations

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

Endpoint

POSThttps://dev.backend.colurs.co/send/user/

Required Headers

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

Request Body

FieldTypeRequiredDescription
to_userintβœ“Recipient user ID
amountdecimalβœ“Amount to send
currencystringβœ“Currency code
send_channelstringβœ“COLURS or DALE
ipstringβœ“Client IP
latitudestringβœ•Latitude GPS
longitudestringβœ•Longitude GPS
descriptionstringβœ•Transfer description

cURL Example

curl -X POST "https://dev.backend.colurs.co/send/user/" \
-H "Authorization: Bearer [TOKEN]" \
-H "x-api-key: [API_KEY]" \
-H "Content-Type: application/json" \
-d '{
  "to_user": 42,
  "amount": 50000,
  "currency": "COP",
  "send_channel": "COLURS",
  "ip": "192.168.1.1"
}'

Response

response.json
{
"message": "OK",
"data": {
  "id": 12345,
  "currency": "COP",
  "fee_amount": 1000.00,
  "fee_iva_amount": 190.00,
  "amount": 50000.00,
  "payed_amount": 51190.00
}
}

Possible Errors

CodeErrorDescription
400BalanceInsufficientInsufficient balance
404ToUserNotExist / ProfileDoesNotExistRecipient does not exist
400ToUserDoesNotAllowBlankto_user is required on execution
404-Fee or configuration not found

If channel is **COLURS**, balance transfers instantly and recipient receives a push notification.


Multiple send (estimate)

Estimate multiple send

Authorizations

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

Endpoint

POSThttps://dev.backend.colurs.co/send/estimate/multiple-user/

Required Headers

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

Request Body

FieldTypeRequiredDescription
profilesarrayβœ“List of objects: profile_id, amount, send_channel
currencystringβœ“Common currency for all sends
is_for_quotebooleanβœ“Whether it is quote-only

Response

response.json
Object with estimated total breakdown (amount, fee_amount, fee_iva_amount, payed_amount according to multiple-send logic).
πŸ“Š
Check **Balance** endpoints to verify funds before creating sends. For standard COP Send, recipient balance limit is also validated.

Multiple send (payout to bank accounts)

Executes money transfer to multiple bank accounts in one request. Each item in profiles indicates recipient (by profile_id or third_party_bank_id), amount, and channel (e.g. associated bank account). Use POST /send/estimate/multiple-user/ first to quote, then this endpoint to execute.

Payout to multiple accounts (multiple-user)

Authorizations

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

Endpoint

POSThttps://dev.backend.colurs.co/send/multiple-user/

Required Headers

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

Request Body

FieldTypeRequiredDescription
currencystringβœ“Common currency for all sends (COP, USD, MXN)
profilesarrayβœ“List of objects: profile_id, amount, send_channel and, for bank payout, third_party_bank_id
ipstringβœ•Client IP
latitudestringβœ•GPS latitude
longitudestringβœ•GPS longitude
is_for_quotebooleanβœ•true = quote only, false = execute payout

Response

response.json
{
"result": {
  "message": 
"OK"}
}
⚠️
For payout to **bank accounts**, each item in profiles must include send_channel (bank code) and third_party_bank_id (account ID created in [Bank withdrawals](/en/pagos/retiros-bancarios)). Use is_for_quote: true to get breakdown without execution.