QvaPay API
P2P

Editar Oferta P2P

Modificar los parámetros de una oferta P2P existente en estado abierto.

POST /p2p/:uuid/edit

Edita una oferta P2P existente. Solo el creador puede editarla y la oferta debe estar en estado open. Para ofertas de venta, si se modifica el monto se ajusta automáticamente el saldo del usuario.

Autenticación

Bearer Token (Authorization: Bearer <token> en headers).

Request

curl -X POST "https://api.qvapay.com/p2p/7c9e6679-7425-40de-944b-e07fc1f90ae7/edit" \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{
    "amount": 60,
    "receive": 15000,
    "only_vip": 0,
    "message": "Nuevo mensaje",
    "webhook": "https://example.com/webhook",
    "tags": ["transferencia"],
    "private": false
  }'

Parámetros (URL)

ParámetroTipoRequeridoDescripción
uuidstringSíUUID de la oferta P2P

Parámetros (body JSON)

Todos los parámetros son opcionales. Solo se actualizan los campos proporcionados.

ParámetroTipoRequeridoDescripción
amountnumberNoNueva cantidad en QUSD (0.1 - 10,000). En ofertas sell, ajusta el saldo
receivenumberNoNueva cantidad a recibir (0.1 - 100,000,000)
only_vipboolean | numberNoRestringir a usuarios VIP
messagestringNoNuevo mensaje público (máx. 79 caracteres, URLs eliminadas). Solo cuentas GOLD: si tu cuenta no es GOLD se ignora sin error y el mensaje guardado no cambia. Vaciarlo ("" o null) sí lo puede cualquier cuenta
webhookstringNoNueva URL de webhook. No puede apuntar a los dominios de QvaPay (400 con code: "WEBHOOK_NOT_ALLOWED")
tagsarrayNoNuevas etiquetas (reemplaza las existentes, máx. 10)
privatebooleanNoSolo se permite cambiar de privada a pública (false), no al revés
offer_kindstringNo"flexible" convierte una oferta fija en una por rango (ver abajo). No hay conversión inversa

Ofertas por rango

En una oferta flexible solo se edita lo que queda por tomar; lo ya tomado por órdenes no se toca. Campos:

CampoTipoDescripción
available_amountnumberNuevo disponible (amount se acepta con el mismo significado). 0 retira el resto sin cancelar las órdenes en curso. En una sell, la diferencia se descuenta o devuelve de tu saldo
receivenumberLo que quieres recibir por el nuevo disponible (fija la tasa de las órdenes futuras)
order_min / order_maxnumberNuevos límites por orden

Ver Ofertas por rango.

Convertir una oferta fija en una por rango

Una oferta fixed en estado open y sin contraparte se puede convertir en una por rango enviando offer_kind: "flexible" con sus límites por orden. Conserva el mismo uuid, sus datos de pago, sus requisitos y su pausa, y queda publicada con todo el monto disponible (nada tomado todavía).

curl -X POST "https://api.qvapay.com/p2p/7c9e6679-7425-40de-944b-e07fc1f90ae7/edit" \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{ "offer_kind": "flexible", "order_min": 10, "order_max": 50 }'
CampoTipoRequeridoDescripción
offer_kindstringSí"flexible"
order_min / order_maxnumberSíLímites por orden, hasta 2 decimales. order_min ≤ order_max ≤ total de la oferta
amountnumberNoNuevo total en QUSD, como al editar una fija. En una sell, la diferencia se descuenta o devuelve de tu saldo
receivenumberNoNuevo total a recibir (fija la tasa de las órdenes)

only_vip, message, webhook, private: false y requirements se aceptan en la misma llamada. La respuesta trae la oferta con offer_kind: "flexible", available_amount, order_min, order_max y converted: true.

Es irreversible: una oferta por rango no se puede volver a convertir en fija (offer_kind: "fixed" sobre una por rango responde 400 con code: "FLEXIBLE_TO_FIXED_NOT_ALLOWED"). Cuenta para el límite de una oferta por rango viva por moneda y lado.

CódigocodeCuándo
400—Faltan order_min/order_max, o no cumplen mínimo ≤ máximo ≤ total
400SYSTEM_OFFERLa oferta entrega una recarga de un cliente
403FLEXIBLE_NOT_ENABLEDTu cuenta no tiene KYC aprobado
409FLEXIBLE_OFFER_EXISTSYa tienes una oferta por rango viva en esa moneda y lado
409OFFER_NOT_EDITABLEAlguien aplicó a la oferta mientras la convertías
409ALREADY_FLEXIBLEOtra petición ya la convirtió

En el feed del mercado, la conversión emite p2p.cancelled (la oferta sale del libro de fijas; llega con offer_kind: "flexible" y status: "open") seguido de p2p.range_created.

Requisitos para quien aplique

requirements (mismo formato y valores que en Crear) reemplaza los requisitos de la oferta, fixed o flexible. {} los quita todos.

Response (200)

{
  "msg": "Oferta P2P editada correctamente",
  "p2p": {
    "uuid": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
    "type": "buy",
    "coin": "BANK_CUP",
    "amount": 60.00,
    "receive": 15000.00,
    "only_kyc": 0,
    "private": 0,
    "only_vip": 0,
    "status": "open",
    "details": { "cuenta": "1234567890" },
    "message": "Nuevo mensaje",
    "webhook": "https://example.com/webhook",
    "created_at": "2024-06-20T14:30:00.000Z",
    "updated_at": "2024-06-20T15:00:00.000Z"
  }
}

Webhook

Si la oferta tiene un webhook configurado, se enviará un POST con:

{
  "operation": "updated",
  "p2p": { ... }
}

Errores

CódigoDescripción
400Datos inválidos, oferta no está en estado open, saldo insuficiente, o intento de cambiar oferta pública a privada
401Token de autenticación inválido o ausente
403No eres el creador de esta oferta
404Oferta P2P no encontrada
409La oferta cambió de estado durante la operación
429Demasiadas solicitudes (límite: 1 cada 10 segundos)
500Error interno al ajustar el saldo