Developer guide
VEXPay siteAPI reference
Browse documentation

Accept Colombian pesos (Bre-B, Nequi, Daviplata)

Take payments from buyers in Colombia on the hosted checkout or from your own screens, test each channel, and refund within 96 hours.

What you will do

Pesos land in a separate COP balance, net of your COP fee (standard 4.5% + COP 1,500 per payment; see the Pricing page). The minimum per payment is COP 20,000. On the hosted checkout you price in USD and VEXPay shows the buyer the peso amount.

  • COP enabled on your account by VEXPay.
  • A webhook endpoint subscribed to payment.completed, payment.failed, payment.canceled and payment.reversed.

Steps: hosted checkout

  1. Create a session

    POST /v1/checkout/sessions with amountUsd and methods containing cop (or no methods).

  2. The buyer picks COP

    The checkout shows the peso total, then Bre-B, Nequi and Daviplata.

  3. The buyer completes the channel

    Bre-B: scan the QR or copy the key into any Colombian bank app (about 15 minutes). Nequi: approve the push in the app (about 5 minutes). Daviplata: type the 6-digit SMS code.

  4. Fulfil from the webhook

    payment.completed with method: "COP", amountCop, feeCop, amountUsd and your checkoutSession reference.

Steps: your own screens (API)

  1. Create the payment

    POST /v1/cop/payments with an Idempotency-Key header, amountCop (whole pesos, at least 20,000), channel (breb, nequi or daviplata) and buyer (required for Nequi and Daviplata: email, phone of 10 digits starting with 3, document type and number).

  2. Show the next step

    The response next tells you what to show: show_qr (QR image and transfer key — returned only once), approve_in_app, or submit_otp.

  3. Daviplata only: send the code

    POST /v1/cop/payments/:id/otp with { "otp": "…" }. A wrong code can be retried while the payment is pending.

  4. Wait for the result

    React to payment.completed or payment.failed, or read GET /v1/cop/payments/:id. Cancel a pending payment with POST /v1/cop/payments/:id/cancel.

curlbash
curl --request POST "${API_URL}/v1/cop/payments" \
  --header "content-type: application/json" \
  --header "x-api-key: ${VEXPAY_API_KEY}" \
  --header "Idempotency-Key: order-5120" \
  --data '{
    "amountCop": 50000,
    "channel": "nequi",
    "reference": "order-5120",
    "buyer": { "email": "juan@example.com", "phone": "3001234567", "documentType": "CC", "documentNumber": "1234567890" }
  }'

Check that it worked

  • Test Nequi: any valid data completes about a minute later. Test Daviplata: code 123456. Never send real pesos in Test.
  • GET /v1/cop/payments/:id shows completed with feeCop.
  • GET /v1/cop/balance shows the net in heldCop (Live) and later in availableCop.

Refund a peso payment

POST /v1/cop/payments/:id/refund refunds the full amount within 96 hours of completion. Your COP balance must cover the net amount that was credited; the COP fee is returned. You then receive payment.reversed with status: "refunded". See Refunds & chargebacks.

If something goes wrong

SymptomLikely causeWhat to do
403 method_not_allowedCOP not enabled on your accountAsk VEXPay to enable it.
400 amount_below_minimumUnder COP 20,000Raise the amount or offer another currency.
400 invalid_data about buyerMissing buyer for Nequi/Daviplata, bad phone, or a Daviplata document other than CC, CE or TIFix the field named in the error.
400 invalid_otpWrong Daviplata codeAsk the buyer for the code again while the payment is pending.
503 method_unavailableThe channel or rate is not available right nowOffer another currency and retry later.
failed with expired or rejectedThe buyer did not approve in time, or declinedStart a new payment.
COP not shown at checkoutTotal under the minimum, no fresh rate, a split session, or turned offSee Turn methods on or off.

Fees: Pricing. Related: Colombia (COP) · Recipe: Colombian pesos · Convert to USDT