Test your whole integration in Test mode
Run every payment method, webhook and payout you plan to use with your Test key — no real money moves — before you ask to go live.
What you will do
Every account has a Live and a Test side. Test works from day one, uses sandboxes, and never charges a real buyer. By the end of this playbook you will have completed a test payment for each method you plan to offer, received and verified its webhook, and read the result in your balance.
- Access to the portal (the login link VEXPay sent you).
- A server that can make HTTPS requests and receive one public HTTPS webhook (use a tunnel when developing locally).
Steps
- Switch the portal to Test
Use the Live | Test toggle in the portal header. You stay signed in. Everything you create while Test is selected belongs to your Test account.
- Create a Test key
Open Credentials, name the key after the integration that will use it (for example "Backend") and click Create key. Copy the key when it is shown and store it in your server environment as
VEXPAY_API_KEY. - Register a Test webhook endpoint
Open Webhooks → New endpoint, or call
POST /v1/webhookswith the Test key. Save the signing secret — it is shown only once. Then click Send test. Full detail: Set up webhooks. - Pay once with every method you will offer
Create a checkout session (or a payment link) with the Test key and pay it. The test controls for each method are in the table below.
- Try the failure paths too
Use a wrong code, let a payment expire, or use a card that declines, and check that your system reacts to
payment.failedandpayment.canceledwithout fulfilling the order. - Read the result
Call
GET /v1/payments/:idandGET /v1/balancewith the Test key. Test accounts have no balance hold, so test credits are available at once.
curl --request POST "${API_URL}/v1/checkout/sessions" \
--header "content-type: application/json" \
--header "x-api-key: ${VEXPAY_API_KEY}" \
--data '{
"amountUsd": 5.00,
"description": "Test order",
"reference": "test-order-1"
}'
# Open the "url" from the response and pay with the test controls below.| Method | How to complete it in Test |
|---|---|
| Card | Use the test card numbers at VPOS. Real cards are declined without being charged. |
| Débito Inmediato (C2P) | Enter the current code shown in Portal → Sandbox. Any other code fails the payment. |
| Pago Móvil (hosted checkout) | The waiting screen shows placeholder details — never send real money to them. Press Simular pago recibido. |
| USDT / USDC | The hosted stablecoin page shows test buttons to confirm, cancel, or simulate a short payment. Deposit addresses cannot be simulated yet; test them through the hosted checkout. |
| Colombian pesos | Nequi: any valid data (for example phone 3001234567, document CC 1234567890) completes about a minute later. Daviplata: code 123456. Never send real pesos in Test. |
| Card chargeback | Pay with 4000000000000259. About a minute later a test chargeback is recorded and payment.chargeback arrives. |
Check that it worked
- Each test payment shows
COMPLETEDinGET /v1/payments/:id(COP:completedinGET /v1/cop/payments/:id) and on the portal Payments page. - Your endpoint received
payment.completedwithlivemode: false, and your signature check passed. Portal → Webhooks → Delivery history shows the delivery as successful. - Your order was marked paid exactly once, even when you replayed the same event.
What behaves differently in Test
- No balance hold: test credits are available immediately (live credits are held for 24 hours).
- Conversions to USDT complete in the same request, and test stablecoin payouts complete at once without a transaction hash.
- Payout-account and seller micro-deposits, and Bolívar payouts, move real céntimos even in Test (always under Bs 0.50 in total). Use a real Pago Móvil destination and read the amounts from the statement.
- USDT, USDC and Colombian pesos appear in Test only when VEXPay has enabled them on your account.
If something goes wrong
| Symptom | Likely cause | What to do |
|---|---|---|
403 live_mode_not_activated | You are sending the Live key | Use the Test key until your account is approved. |
| 401 on every call | Key missing, mistyped, revoked or rotated | Copy the key again from Credentials (Test selected). |
| A method is missing on the test checkout | Not enabled on your account, or turned off in Payment methods | See Turn methods on or off. Ask VEXPay to enable a method you need. |
| Débito Inmediato fails with a code error | The code changed or was mistyped | Use the code shown in Portal → Sandbox at that moment. |
| Webhook endpoint refused with 400 | URL is localhost, private, or not http(s) | Use a public HTTPS URL, for example a tunnel to your machine. |
Related: Integration path · Going live · Go live