QvaPay API
P2P

Comprobantes

Adjuntar imágenes o PDF a un trato P2P. Privados entre las dos partes y soporte.

Un comprobante es la evidencia de un trato, no parte del anuncio. Solo lo ven las dos partes del trato en curso y el equipo de soporte, y los ficheros se guardan como privados: no tienen una URL pública, a diferencia de las imágenes del chat.

En una oferta fija el trato es el ciclo del peer actual: si quien tomó la oferta se va y entra otro, el nuevo no ve lo anterior, y si la misma persona vuelve, tiene que subir un comprobante nuevo. En una oferta por rango el trato es la orden: añade ?order=<uuid de la orden> a todas las llamadas.

GET /p2p/:uuid/attachments

Lista los comprobantes del trato y los límites.

Autenticación

Bearer Token, o app-id / app-secret. Un token acotado necesita p2p:buy o p2p:sell, según el lado que juegues: p2p:read no llega.

Respuesta

{
  "attachments": [
    {
      "uuid": "1f0c6b1e-5d7a-4d2e-9a53-4a2f0a0d9a11",
      "kind": "pdf",
      "mime": "application/pdf",
      "size": 245120,
      "mine": true,
      "created_at": "2026-11-06T15:04:05.000Z"
    }
  ],
  "limits": {
    "max_bytes": 4194304,
    "max_per_party": 5,
    "remaining": 4,
    "can_upload": true,
    "proof_replaces_tx_id": true
  }
}

mine dice si lo subiste tú. El nombre original del fichero nunca se devuelve.

proof_replaces_tx_id dice si un comprobante propio basta para marcar el pago sin tx_id.

POST /p2p/:uuid/attachments

Sube un comprobante como multipart/form-data, campo file. Solo puede hacerlo quien paga el fiat, mientras el trato esté en processing, paid o revision. La otra parte puede verlo, pero no subir nada: para ella limits.can_upload llega en false.

curl -X POST "https://api.qvapay.com/p2p/7c9e6679-7425-40de-944b-e07fc1f90ae7/attachments" \
  -H "Authorization: Bearer <token>" \
  -F "[email protected]"

Responde 201 con { "attachment": { … } }, y la otra parte recibe un aviso en el chat del trato.

LímiteValor
Tamaño4 MB
TiposJPG, PNG, WEBP y PDF, comprobados por su contenido
Por trato5
Ritmo6 por minuto

Las imágenes se recodifican a JPEG de hasta 2000 px y pierden sus metadatos, GPS incluido. Los PDF se guardan tal cual.

Un comprobante no se puede borrar ni reemplazar: es evidencia. Si te equivocas, sube el correcto y explícalo en el chat.

Errores

StatuscodeSignificado
400ORDER_REQUIREDOferta por rango sin ?order=
400MULTIPART_REQUIREDEl cuerpo no es multipart
400ATTACHMENT_MISSINGFalta el campo file
403ATTACHMENT_PAYER_ONLYSolo quien paga el fiat puede adjuntar
409ATTACHMENT_STATEEl trato ya no admite comprobantes
409ATTACHMENT_LIMITYa subiste el máximo
413ATTACHMENT_TOO_LARGESupera los 4 MB
415ATTACHMENT_TYPETipo no admitido
429RATE_LIMITEDDemasiados seguidos
503ATTACHMENTS_UNAVAILABLEInténtalo más tarde

GET /p2p/:uuid/attachments/:id

Descarga el fichero. Responde 404 a quien no pueda verlo, también si el comprobante no existe.

Un comprobante no demuestra un pago: una captura se falsifica en minutos. Libera solo cuando el dinero esté en tu cuenta.