Estados de la Operación
Una vez creada la operación, InvWallet ejecuta los steps de forma asíncrona. La billetera debe hacer polling para conocer el estado actual.
Polling de estado
Método: GET
URL: /api/v1/mep/operations/{id}/
Retorna el estado actual de la operación, con result y final_amount_* actualizados a medida que avanza.
InvWallet no envía callbacks. La billetera debe hacer polling sobre este endpoint para conocer el estado. Frecuencia recomendada: cada 30 segundos durante la fase activa (BUY/SELL), cada hora durante PARK.
Estados posibles
state | Descripción |
|---|---|
pending | Operación creada, esperando ejecución del primer step |
buying | Comprando bono ARS en el mercado |
parking | En período de parking normativo (esperando días hábiles) |
selling | Vendiendo bono USD en el mercado |
cashing_out | Transfiriendo USD al CBU del inversor |
completed | Operación finalizada exitosamente ✓ |
cancelled | Operación cancelada (terminal) |
failed | Un step falló — requiere intervención manual (terminal) |
Flujo de estados
CREAR OPERACIÓN
│
▼
┌──────────────┐
│ BUY pending │ ◄── único estado cancelable
└──────┬───────┘
│ Tarea asíncrona
▼
┌──────────────────┐
│ BUY processing │
└──────┬───────────┘
│ Evento FILLED del OMS
▼
┌──────────────────┐
│ BUY completed │
└──────┬───────────┘
│ (si parking_days > 0)
▼
┌──────────────────┐
│ PARK pending │ ◄── espera N días hábiles
└──────┬───────────┘
│ Cron diario
▼
┌──────────────────┐
│ PARK completed │
└──────┬───────────┘
│
▼
┌──────────────────┐
│ SELL processing │
└──────┬───────────┘
│ Evento FILLED del OMS
▼
┌──────────────────┐
│ SELL completed │
└──────┬───────────┘
│ (si do_cashout=true)
▼
┌──────────────────────┐
│ CASHOUT processing │
└──────┬───────────────┘
▼
┌──────────────────────┐
│ CASHOUT completed │ → state: "completed" ✓
└──────────────────────┘
En cualquier step:
→ FAILED → state: "failed" ✗ (requiere intervención de InvWallet)
Si parking_days = 0, el step PARK se omite y la operación avanza directamente de BUY a SELL.
Campo result
El campo result es un JSON que se completa a medida que avanzan los steps. Ejemplo de operación completada:
{
"buy": {
"status": "completed",
"timestamp": "2026-04-28T14:32:45Z",
"order_id": "OMS-BUY-00123",
"price": 1095.50,
"quantity": 45.63
},
"park": null,
"sell": {
"status": "completed",
"timestamp": "2026-05-03T15:10:22Z",
"order_id": "OMS-SELL-00456",
"price": 68.15,
"quantity": 45.63
},
"cashout": {
"status": "completed",
"timestamp": "2026-05-03T15:15:01Z",
"amount_usd": "44.76",
"bank_ref": "TRF-CBU-789"
}
}
En caso de falla, el step fallido incluye el error:
{
"buy": {
"status": "failed",
"timestamp": "2026-04-28T14:33:02Z",
"error": "OMS rejected order: insufficient holdings"
}
}
Operaciones fallidas
Cuando state = "failed", el campo result contiene el detalle del error en el step que falló. No hay retry automático.
La billetera debe:
- Detectar
state = "failed"vía polling - Notificar al usuario final que la operación no pudo completarse
- Contactar a InvWallet para que un operador revise el caso desde el backoffice
Textos sugeridos para la UX
state | Texto sugerido |
|---|---|
pending | "Operación creada, iniciando..." |
buying | "Comprando bono en el mercado..." |
parking | "En período de espera normativo ({N} días hábiles restantes)" |
selling | "Vendiendo bono USD..." |
cashing_out | "Transfiriendo USD a tu cuenta..." |
completed | "¡Operación completada! Recibiste {final_amount_usd} USD" |
failed | "La operación encontró un error. Nuestro equipo está revisando el caso." |
cancelled | "Operación cancelada" |