Skip to main content

Simulate COP Deposit (Sandbox)

In sandbox, COP deposits are simulated end-to-end for both rails (PSE and Bre-B) — you do not need to open the PSE link or send a real Bre-B transfer to finish the flow. This page explains how the simulation works so you can run through the full COP → crypto journey without touching real rails.

info

This behavior is sandbox only. In production the user must open the depositUrl in a browser and complete the actual PSE payment at their Colombian bank for the ticket to move beyond UNPAID.

What happens when you create a COP ticket in sandbox

  1. Quote + ticket — you call GET /v2/account/quote/fixed-rate and then POST /v2/account/tickets/ exactly like in production. The flow is identical from an API consumer perspective.
  2. Deposit URL — the ticket response includes a depositUrl shaped like https://links.avenia.cobre/<uuid>. It is intentionally non-resolving — it exists only to mirror the production response shape. Do not expect it to open a payment page.
  3. Auto-settlement (async) — a background job dispatches the equivalent of a payin_status_changed = COMPLETED webhook straight into the processing pipeline, without waiting for a real PSE payment.
  4. Ticket lifecycle completes — the ticket transitions UNPAID → PROCESSING → PAID, mock tokens are credited to the specified wallet, and the usual TICKET-CREATED, DEPOSIT-PROCESSING, DEPOSIT-SUCCESS, and TICKET-COMPLETE webhooks fire, matching production.

Typical end-to-end time: about 70 seconds between ticket creation and PAID (the bulk is the async token-mint step, not the deposit itself).

Amount limits

The simulation fires for COP deposits up to 700,000 COP (roughly equivalent to R$1,000 at current FX). Amounts above that cap are still accepted by the ticket API, but the auto-settlement is skipped — tickets stay UNPAID until manually completed. Keep test amounts under the cap.

Example

1. Quote

curl -X GET "https://api.sandbox.avenia.io:10952/v2/account/quote/fixed-rate?inputCurrency=COP&inputPaymentMethod=BANK-TRANSFER&inputAmount=500000&outputCurrency=USDC&outputPaymentMethod=INTERNAL&inputThirdParty=false&outputThirdParty=false&blockchainSendMethod=PERMIT" \
-H "Authorization: Bearer eyJhdXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

2. Ticket

curl -X POST "https://api.sandbox.avenia.io:10952/v2/account/tickets/" \
-H "Authorization: Bearer eyJhdXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" \
-H "Content-Type: application/json" \
-d '{
"quoteToken": "eyJhdXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"ticketBlockchainOutput": {
"walletAddress": "0xabcdefabcdefabcdefabcdefabcdefabcdefabcd"
}
}'

Sample response:

{
"id": "e0a5b2f2-c0d7-486c-a3dd-cb32a1715c51",
"depositUrl": "https://links.avenia.cobre/63144f74-52ac-48a8-a25c-7c5491dbbcbf",
"expiration": "2026-05-01T13:26:12.307Z"
}

3. Poll the ticket

Nothing else is required. Poll the ticket until it reports PAID:

curl -X GET "https://api.sandbox.avenia.io:10952/v2/account/tickets/e0a5b2f2-c0d7-486c-a3dd-cb32a1715c51" \
-H "Authorization: Bearer eyJhdXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

You should see the status transition from UNPAIDPROCESSINGPAID within roughly a minute.

Bre-B deposits

Bre-B deposits use the same simulation pipeline. The only API differences are:

  • Quote uses inputPaymentMethod=BRE-B instead of BANK-TRANSFER.
  • Ticket response includes breBKey instead of depositUrl.
  • Ticket expiration is 24 hours (same as PSE).

Example quote:

curl -X GET "https://api.sandbox.avenia.io:10952/v2/account/quote/fixed-rate?inputCurrency=COP&inputPaymentMethod=BRE-B&inputAmount=50000&outputCurrency=USDC&outputPaymentMethod=INTERNAL&inputThirdParty=false&outputThirdParty=false&blockchainSendMethod=PERMIT" \
-H "Authorization: Bearer eyJhdXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

Example ticket response:

{
"id": "bb3a6430-55c5-4c43-9d17-9262cb71e935",
"breBKey": "@CBW0ZWQT6",
"expiration": "2026-05-06T14:08:11.197319Z"
}

In sandbox, the breBKey returned is a fixed test value (e.g. @CBW0ZWQT6). The ticket auto-completes within ~70 seconds, no real Bre-B transfer needed.

Simulating COP payouts

Crypto → COP payouts are simulated for both rails as well:

  • PSE — Create the ticket with outputPaymentMethod=BANK-TRANSFER and a beneficiary registered with bank fields. The ticket reaches PAID within a second.
  • Bre-B — Create the ticket with outputPaymentMethod=BRE-B and a beneficiary registered with breBKey. Same auto-complete behavior.

No real payout is executed and no real COP is sent. Minimum amount remains 5 USDC.

What is not simulated

The following still hit the real staging rails and behave exactly as production would:

  • Creating COP beneficiaries (POST /v2/account/beneficiaries/bank-accounts/cop/) — including Bre-B key validation
  • Listing supported COP banks (GET /.../cop/supported-banks)
  • KYC approval for new accounts

If any of those endpoints return an unexpected error in sandbox, it reflects a real issue with the upstream staging rail — not with the simulation.