QvaPay API
P2P

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_kindCómo se toma
fixedEntera, por una sola contraparte. Es el comportamiento de siempre.
flexiblePor 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

CampoDescripción
amountTotal original de la oferta (lo ya tomado + lo que queda)
available_amountLo que queda por tomar. Es lo que debes mostrar
reserved_amountLo que está en órdenes activas
order_min / order_maxMínimo y máximo por orden
receive / amountLa 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 amount responde 400 con code: "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 una fixed.

Operar la orden

Pagado, recibido, cancelar y chat son las mismas rutas de siempre, con ?order=<uuid de la orden>:

AcciónRutaQuién
Marcar pagadoPOST /p2p/:uuid/paid?order=…Quien paga el fiat (taker en sell, dueño en buy)
Confirmar recibidoPOST /p2p/:uuid/received?order=…Quien recibe el fiat
CancelarPOST /p2p/:uuid/cancel?order=…Cualquiera de las dos partes (ver disputas)
ChatGET / 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 409 con code: "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.

CampoDescripción
available_amountNuevo disponible. 0 retira el resto sin cancelar las órdenes en curso. En una venta, la diferencia se descuenta o se devuelve de tu saldo
receiveLo que quieres recibir por el nuevo disponible (fija la tasa de las órdenes futuras)
order_min / order_maxNuevos límites por orden

Para cancelar la oferta entera (POST /p2p/:uuid/cancel sin order) no puede tener órdenes activas.