QvaPay API
Coins

Listar Coins

Obtener todas las categorías de monedas con sus coins asociados, incluyendo comisiones, límites y datos de retiro.

GET /coins

Retorna todas las categorías de monedas (Criptomonedas, Bank, Cash, E-Wallet, Gift Card, Móvil) junto con los coins que pertenecen a cada una. Cada coin incluye su configuración completa: comisiones de entrada y salida, límites, campos requeridos para retiros y estado de disponibilidad.

Autenticación

No requiere autenticación (endpoint público).

Request

curl -X GET https://api.qvapay.com/coins

Response

[
  {
    "id": 1,
    "name": "Criptomonedas",
    "logo": "crypto",
    "Coins": [
      {
        "id": "6",
        "coins_categories_id": 1,
        "network": "TRON",
        "name": "USDT (TRC20)",
        "logo": "usdt",
        "tick": "USDT",
        "fee_in": "0.2",
        "fee_in_gold": "0",
        "fee_out": "1",
        "fee_out_gold": "0.8",
        "fee_out_fixed": [100, 1],
        "min_in": "1",
        "min_out": "2",
        "max_in": 1000000,
        "max_out": 5000,
        "working_data": [
          {
            "name": "Wallet",
            "type": "text"
          }
        ],
        "enabled_in": true,
        "enabled_out": true,
        "enabled_p2p": true,
        "auto_withdraw": true,
        "p2p_rate_discount": "0",
        "trade": false,
        "price": "1",
        "decimals": 2,
        "stable": true,
        "created_at": null,
        "updated_at": "2025-06-12T03:40:01.000Z",
        "description": "### ¿Qué es USDT (TRC20)? ...",
        "seo_title": "USDT TRC20 ✓ Compra y envía en QvaPay",
        "seo_description": "USDT TRC20 en QvaPay: stablecoin rápido y seguro..."
      }
    ]
  }
]

Campos de la categoría

CampoTipoDescripción
idnumberID de la categoría
namestringNombre de la categoría (Criptomonedas, Bank, Cash, E-Wallet, Gift Card, Móvil)
logostringIdentificador del logo de la categoría
CoinsarrayCoins pertenecientes a la categoría

Campos del coin

CampoTipoDescripción
idstringID del coin (BigInt serializado como string)
coins_categories_idnumberID de la categoría a la que pertenece
networkstring | nullRed blockchain del activo (BTC, TRON, BSC, SOL, TON, etc.). null para métodos sin red o red implícita
namestringNombre para mostrar (ej: USDT (TRC20))
logostringIdentificador del logo
tickstringTicker único del coin (ej: USDT, BTCLN, BANK, BANK_INTL, BANK_EUR)
fee_instringComisión de depósito en porcentaje (%)
fee_in_goldstringComisión de depósito (%) para usuarios GOLD
fee_outstringComisión de retiro en porcentaje (%)
fee_out_goldstringComisión de retiro (%) para usuarios GOLD
fee_out_fixedarray | nullFee fijo de retiro para montos pequeños: [umbral, fee_fijo]. Ver Cómo funciona fee_out_fixed
min_instringMonto mínimo de depósito en USD
min_outstringMonto mínimo de retiro en USD
max_innumberMonto máximo de depósito en USD
max_outnumberMonto máximo de retiro en USD
working_dataarrayCampos que el usuario debe completar al solicitar un retiro. Ver Campos de working_data
enabled_inbooleanDepósitos habilitados
enabled_outbooleanRetiros habilitados
enabled_p2pbooleanDisponible en el mercado P2P
auto_withdrawbooleanLos retiros se procesan automáticamente (sin revisión manual)
p2p_rate_discountstringAjuste de tasa aplicado en el mercado P2P
tradebooleanDisponible en el módulo de trading
pricestringPrecio actual del activo en USD
decimalsnumberDecimales usados para representar montos del activo
stablebooleantrue si es una stablecoin o método con paridad 1:1 con USD
created_atstring | nullFecha de creación
updated_atstring | nullÚltima actualización (los precios se refrescan periódicamente)
descriptionstringDescripción del activo en formato Markdown
seo_titlestringTítulo SEO de la página pública del coin
seo_descriptionstringDescripción SEO de la página pública del coin
cash_zonesobject(Solo monedas de efectivo con tarifario por municipio, p. ej. USDCASH) Tarifas de entrega por provincia y municipio. Ver Tarifario de efectivo por municipio. En el resto de coins el campo no aparece

Cómo funciona fee_out_fixed

fee_out_fixed define un fee fijo para retiros de montos pequeños, en lugar del porcentaje fee_out. Es un arreglo de dos valores:

fee_out_fixed: [umbral, fee_fijo]
  • umbral (primer valor): límite en USD que separa los dos modos de comisión.
  • fee_fijo (segundo valor): comisión fija en USD que se cobra cuando el monto del retiro es menor o igual al umbral.

La regla de cálculo es:

Monto del retiroComisión aplicada
monto <= umbralFee fijo: fee_fijo USD (no se aplica porcentaje)
monto > umbralPorcentaje: monto × fee_out / 100 (o fee_out_gold para usuarios GOLD)

Cuando fee_out_fixed es null, siempre se aplica el porcentaje fee_out sin importar el monto.

Ejemplo

USDT (TRC20) tiene fee_out: "1" y fee_out_fixed: [100, 1]:

  • Retiro de $50 → como 50 <= 100, se cobra el fee fijo de $1. El usuario recibe $49.
  • Retiro de $100 → como 100 <= 100, se cobra el fee fijo de $1. El usuario recibe $99.
  • Retiro de $500 → como 500 > 100, se cobra el 1%: $5. El usuario recibe $495.

Este esquema evita que los retiros pequeños paguen comisiones porcentuales insignificantes que no cubren el costo de red, garantizando un fee mínimo rentable, mientras que los retiros grandes pagan el porcentaje normal.

Nota: para usuarios GOLD el porcentaje usado por encima del umbral es fee_out_gold, pero el fee fijo por debajo del umbral es el mismo para todos los usuarios.

Campos de working_data

working_data describe el formulario que el usuario debe completar al retirar en ese coin (ej: dirección de wallet, datos bancarios, número de celular). Cada elemento tiene:

CampoTipoDescripción
namestringNombre del campo (ej: Wallet, Nro de cuenta o tarjeta)
typestringTipo de campo: text, select, phone, email o number
labelstring(Opcional) Etiqueta para mostrar en el formulario. La web la muestra en lugar de name; la clave de details sigue siendo name
placeholderstring(Opcional) Texto de ayuda del campo
requiredboolean(Opcional) Si el campo es obligatorio
optionsarray(Solo type: select) Opciones disponibles

Las opciones de un campo select pueden incluir metadatos adicionales:

CampoTipoDescripción
valuestringValor de la opción (ej: La Habana)
eta_hoursstringTiempo estimado de entrega en horas (ej: 1-72)
fee_pctnumberRecargo porcentual extra sobre el monto del retiro al elegir esta opción

Efectivo por zonas: si una moneda de efectivo tiene tarifario por municipio (cash_zones en el propio coin, o GET /withdraw/cash-zones?coin=…), el fee_pct de la provincia se ignora y el recargo sale de la zona elegida. Ver Listar y Crear Retiros.

Tarifario de efectivo por municipio (cash_zones)

Las monedas de efectivo que se entregan por municipio (hoy USDCASH) llevan el tarifario completo dentro del coin, con el mismo contenido que GET /withdraw/cash-zones. El campo aparece igual en GET /coins, GET /coins/v2 y GET /coins/:id.

"cash_zones": {
  "margin_pct": 1,
  "zones": [
    {
      "id": "1",
      "coin_tick": "USDCASH",
      "province_code": "ART",
      "province_name": "Artemisa",
      "municipality": "Artemisa",
      "is_capital": true,
      "provider_pct": 3,
      "margin_pct": null,
      "total_pct": 4,
      "min_usd": 50,
      "small_flat_usd": 4,
      "eta_min_hours": 24,
      "eta_max_hours": 48,
      "home_delivery": true,
      "route": "p2p",
      "enabled": true
    }
  ]
}
CampoDescripción
margin_pctMargen de servicio global en %, usado por las zonas que no tienen uno propio
zones[].province_code / province_nameProvincia; en el retiro va en el primer campo select del working_data
zones[].municipalityMunicipio, tal como debe enviarse en el campo Municipio del retiro
zones[].provider_pctTarifa de entrega en % del monto
zones[].margin_pctMargen de servicio de la zona en %; null = usa el margin_pct global
zones[].total_pctRecargo total en % (provider_pct + margen efectivo). Es lo que se cobra cuando la tarifa fija no es mayor
zones[].small_flat_usdTarifa de entrega fija en USD cuando es mayor que el % (montos pequeños); null = no aplica
zones[].min_usdMínimo a entregar (monto neto a recibir) en ese municipio
zones[].eta_min_hours / eta_max_hoursPlazo estimado de entrega
zones[].home_deliveryfalse = sin entrega a domicilio (el beneficiario recoge el efectivo)

Cargo de la zona sobre el amount del retiro, que se suma al fee_out del coin: max(amount × provider_pct / 100, small_flat_usd) + amount × margen / 100. Por ejemplo, retirar $200 en Artemisa cuesta max(6, 4) + 2 = $8 de cargo de zona, más el fee_out del coin.

Si la moneda deja de entregarse por zonas, cash_zones desaparece y el retiro vuelve al fee_pct del select de provincia. Las tarifas pueden tardar hasta unos 15 minutos en reflejar un cambio (caché).

Notas

  • La respuesta es un array JSON de categorías, cada una con sus coins en la propiedad Coins.
  • Los IDs de tipo BigInt se serializan como strings en la respuesta.
  • Los precios (price) de activos no estables se actualizan periódicamente mediante un cron; el campo updated_at refleja la última actualización.
  • Las comisiones fee_in, fee_in_gold, fee_out y fee_out_gold son siempre porcentajes, no montos fijos.