Ofertas por rango
Ofertas P2P que se toman por partes, entre un mínimo y un máximo por orden.
Una oferta P2P puede ser de dos tipos, indicado en el campo offer_kind de cada oferta:
offer_kind | Cómo se toma |
|---|---|
fixed | Entera, por una sola contraparte. Es el comportamiento de siempre. |
flexible | Por rango: cada contraparte toma solo la parte que necesita, entre order_min y order_max, hasta agotar la oferta. Cada parte tomada es una orden independiente. |
Las ofertas por rango están disponibles hoy para cuentas VIP. Las demás cuentas no las reciben en el listado; si tu integración aplica a una sin poder hacerlo, responde 403 con code: "FLEXIBLE_NOT_ENABLED".
Campos
| Campo | Descripción |
|---|---|
amount | Total original de la oferta (lo ya tomado + lo que queda) |
available_amount | Lo que queda por tomar. Es lo que debes mostrar |
reserved_amount | Lo que está en órdenes activas |
order_min / order_max | Mínimo y máximo por orden |
receive / amount | La tasa. Cada orden congela la tasa del momento en que se tomó |
En el listado puedes filtrar con offer_kind=fixed u offer_kind=flexible.
Tomar una parte
POST /p2p/:uuid/apply con el monto en el body:
curl -X POST "https://api.qvapay.com/p2p/7c9e6679-7425-40de-944b-e07fc1f90ae7/apply" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{ "amount": 25.50 }'{
"message": "Aplicado a una parte de la oferta",
"p2p": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"order": "0b8f2c1e-5a7d-4e3b-9c61-2f4d8a9e7b10",
"amount": "25.5",
"receive": "12750",
"transaction": null
}- Sin
amountresponde400concode: "FLEXIBLE_AMOUNT_REQUIRED"y los límites (order_min,order_max,available_amount). - Solo puedes tener una orden activa por oferta (
409 ORDER_ALREADY_ACTIVE). - En una oferta de compra (
buy) el monto de tu orden se descuenta de tu saldo como garantía, igual que en unafixed.
Operar la orden
Pagado, recibido, cancelar y chat son las mismas rutas de siempre, con ?order=<uuid de la orden>:
| Acción | Ruta | Quién |
|---|---|---|
| Marcar pagado | POST /p2p/:uuid/paid?order=… | Quien paga el fiat (taker en sell, dueño en buy) |
| Confirmar recibido | POST /p2p/:uuid/received?order=… | Quien recibe el fiat |
| Cancelar | POST /p2p/:uuid/cancel?order=… | Cualquiera de las dos partes (ver disputas) |
| Chat | GET / POST /p2p/:uuid/chat?order=… | Las dos partes de esa orden |
GET /p2p/:uuid devuelve Orders (el dueño ve todas; un taker solo las suyas) y can_take_flexible.
Cancelaciones y disputas
- Quien paga el fiat puede cancelar su orden mientras no haya disputa: la garantía vuelve a su dueño.
- Quien recibe el fiat no cancela directamente, porque la otra parte pudo haber pagado ya: su cancelación abre una disputa (la orden pasa a
status: "revision"; la respuesta trae"status": "revision"). - En disputa ninguna de las partes puede mover la orden: ni confirmar recibido, ni cancelar. Esas llamadas responden
409concode: "ORDER_IN_DISPUTE". Un moderador revisa el chat de la orden y resuelve: libera el dinero a quien pagó el fiat o devuelve la garantía a su dueño. Las dos partes reciben un aviso con la decisión. - Usa el chat de la orden para aportar comprobantes durante la disputa.
Cada orden es su propia disputa: el resto de la oferta sigue operando.
Editar una oferta por rango
POST /p2p/:uuid/edit solo cambia lo que queda por tomar; lo ya tomado no se toca.
| Campo | Descripción |
|---|---|
available_amount | Nuevo disponible. 0 retira el resto sin cancelar las órdenes en curso. En una venta, la diferencia se descuenta o se devuelve de tu saldo |
receive | Lo que quieres recibir por el nuevo disponible (fija la tasa de las órdenes futuras) |
order_min / order_max | Nuevos límites por orden |
Para cancelar la oferta entera (POST /p2p/:uuid/cancel sin order) no puede tener órdenes activas.