Skip to main content
Con el servicio de Conversión COP→USDT conviertes pesos colombianos de tu cuenta Mouv en USDT, que se entregan on-chain a una billetera de tu empresa. Los USDT no se acreditan como saldo en Mouv: llegan directamente a tu billetera.
El servicio se habilita por empresa y solo para clientes seleccionados. Si tu empresa no lo tiene activo, los endpoints responden 403 SWAP_NOT_ENABLED y no es posible crear una API key con scope SWAP. Escríbenos a hola@vectora.com.co para solicitarlo.

Qué incluye

No hay ambiente de pruebas (sandbox). El onboarding se hace con una compra real de monto mínimo, acompañada por el equipo de Mouv.

Antes de empezar

  1. Habilitación: solicita a Mouv que active el servicio para tu empresa.
  2. API key con scope SWAP: un usuario ADMIN la crea en el dashboard (API keys → scope SWAP). Ver Scopes y permisos.
  3. Billetera registrada: por defecto las billeteras se registran desde el dashboard, con rol ADMIN y código 2FA. Opcionalmente puedes registrarlas por API (ver Registrar billeteras por API).
¿Por qué por defecto no se registran por API? Es una medida de seguridad: si una API key se filtra, quien la tenga no puede registrar una billetera nueva y desviar tus fondos hacia ella. Una llave SWAP común solo puede operar contra billeteras que ya aprobaste con 2FA desde el dashboard.
La billetera debe estar a nombre de tu empresa (razón social registrada en Mouv). No se aceptan billeteras de terceros ni de personas naturales. Una billetera nueva queda EN_REVISION hasta que supera la revisión de cumplimiento; luego pasa a DISPONIBLE. Si tu empresa tiene configurado un período de espera (walletCooldownHours, por defecto 0), la billetera pasa por EN_ESPERA hasta availableFrom. Solo opera una billetera DISPONIBLE.

Registrar billeteras por API (opcional)

Si tu integración necesita dar de alta billeteras sin pasar por el dashboard, Mouv puede habilitar la gestión de billeteras por API para tu empresa. No está activa por defecto: solicítala a hola@vectora.com.co. Una vez habilitada, un usuario ADMIN crea en el dashboard (con 2FA) una llave SWAP con el permiso Gestionar billeteras. Reglas:
  • Las IPs autorizadas (allowedIps) son obligatorias para esa llave.
  • Máximo 2 llaves vigentes con el permiso por empresa.
  • Con esa llave puedes usar POST /swaps/wallets y DELETE /swaps/wallets/:walletId, sin 2FA y con Idempotency-Key obligatoria en el alta. Una llave SWAP sin el permiso sigue pudiendo listar y consultar.
  • El titular es siempre tu empresa.
  • La billetera pasa por revisión de cumplimiento antes de poder operar: nace EN_REVISION y solo cuando está DISPONIBLE acepta cotizaciones. Haz polling a GET /swaps/wallets/:walletId.
  • Límites: 10 altas por API cada 24 horas y 20 billeteras vigentes.
  • Los ADMIN de tu empresa reciben un correo por cada billetera registrada por API. Si no la reconocen, pueden marcar No la reconozco en el dashboard: se dan de baja las billeteras registradas por esa llave y la llave se revoca.
Para saber si tu llave puede gestionar billeteras, consulta canManageWallets en GET /swaps/me.
Si usas esta función, trata la llave con permiso de billeteras como una credencial de máxima sensibilidad: guárdala en un gestor de secretos, limita las IPs al mínimo y no la compartas con otros servicios. Usa una llave SWAP distinta, sin el permiso, para cotizar y aceptar.

Flujo: registrar una billetera y esperar a que esté disponible

Si hay un timeout al registrar, reintenta con la misma Idempotency-Key: devuelve la misma billetera (200, replay: true) y no consume el tope diario. Si el estado pasa a ELIMINADA, la billetera fue dada de baja y no operará. La revisión puede tardar; no hay un plazo garantizado, así que usa un intervalo de consulta amplio (por ejemplo 1 minuto o más). Para eliminar una billetera: DELETE /swaps/wallets/:walletId.

Flujo completo

Todos los ejemplos usan la base https://consola.mouvlatam.com/api y el header Authorization: Bearer mvk_... con tu llave SWAP.

1. Consultar si puedes operar y tus límites

Revisa enabled, networks, minUsdt y maxUsdt. Ver GET /swaps/me.

2. Ver las redes habilitadas

3. Elegir la billetera destino

Toma el id de una billetera con status: "DISPONIBLE" cuya network coincida con la red que vas a usar.

4. Cotizar

La respuesta trae quote.id, la tasa final (rate), los montos definitivos y expiresAt. Acepta antes de expiresAt: si venció, vuelve a cotizar. Hay un límite de 30 cotizaciones por minuto por empresa.

5. Aceptar con Idempotency-Key

Con API key el header Idempotency-Key es obligatorio (8 a 128 caracteres: letras, números y _ - : .). La operación nace en PROCESANDO y tus pesos quedan comprometidos.
Esta llamada puede tardar hasta ~8 segundos. Configura un timeout de cliente de al menos 30 segundos. Si hay timeout, reintenta con la MISMA Idempotency-Key: devuelve la misma operación (replay: true) y nunca crea una segunda. Nunca uses una key nueva para el mismo intento.

6. Consultar el estado hasta COMPLETADO

Consulta cada 10 a 15 segundos. PROCESANDO puede durar varios minutos mientras se entregan los USDT; es normal y no debes repetir la operación. Al llegar a COMPLETADO, el campo txHash trae el hash de la transacción on-chain.

7. Descargar el comprobante

Disponible solo cuando la operación está COMPLETADO.

Estados de una operación

Mouv aún no envía notificaciones automáticas de swaps: consulta el estado por polling.

Errores comunes

La lista completa está en Códigos de error.

Buenas prácticas

Llave SWAP dedicada

Crea una API key exclusiva para este servicio. El scope SWAP solo funciona en /swaps/* y no hereda permisos de WRITE, así que una filtración queda acotada.

Restringe por IP (allowedIps)

Al crear la llave, define allowedIps con las IPs de salida de tus servidores. Es opcional, pero recomendado para llaves SWAP: una llave usada desde otra IP recibe 403 IP_NOT_ALLOWED.

Una key por intento

Genera un UUID nuevo por cada intención de compra y reutilízalo solo para reintentar ese mismo intento. Si tienes dudas, consulta GET /swaps antes de aceptar de nuevo.

Timeout de 30 s o más

POST /swaps puede tardar ~8 s. Con un timeout corto podrías reintentar innecesariamente; si ocurre, reintenta con la misma Idempotency-Key.

Usa expiresAt

Acepta apenas recibas la cotización y siempre compara con expiresAt en lugar de asumir una duración.

Rota las llaves

Genera una nueva, cambia tu servicio y revoca la anterior. Ver Autenticación.

Referencia de endpoints

GET /swaps/me

GET /swaps/networks

GET /swaps/wallets

POST /swaps/wallets

GET /swaps/wallets/:walletId

DELETE /swaps/wallets/:walletId

POST /swaps/quotes

POST /swaps

GET /swaps

GET /swaps/:id

GET /swaps/:id/receipt.pdf