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
Antes de empezar
- Habilitación: solicita a Mouv que active el servicio para tu empresa.
- API key con scope
SWAP: un usuarioADMINla crea en el dashboard (API keys → scopeSWAP). Ver Scopes y permisos. - Billetera registrada: por defecto las billeteras se registran desde el dashboard, con rol
ADMINy 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.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 usuarioADMIN 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/walletsyDELETE /swaps/wallets/:walletId, sin 2FA y conIdempotency-Keyobligatoria en el alta. Una llaveSWAPsin 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_REVISIONy solo cuando estáDISPONIBLEacepta cotizaciones. Haz polling aGET /swaps/wallets/:walletId. - Límites: 10 altas por API cada 24 horas y 20 billeteras vigentes.
- Los
ADMINde 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.
canManageWallets en GET /swaps/me.
Flujo: registrar una billetera y esperar a que esté disponible
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 basehttps://consola.mouvlatam.com/api y el header Authorization: Bearer mvk_... con tu llave SWAP.
1. Consultar si puedes operar y tus límites
enabled, networks, minUsdt y maxUsdt. Ver GET /swaps/me.
2. Ver las redes habilitadas
3. Elegir la billetera destino
id de una billetera con status: "DISPONIBLE" cuya network coincida con la red que vas a usar.
4. Cotizar
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
Idempotency-Key es obligatorio (8 a 128 caracteres: letras, números y _ - : .). La operación nace en PROCESANDO y tus pesos quedan comprometidos.
6. Consultar el estado hasta COMPLETADO
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
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.