QR Crypto POS está disponible para cuentas empresa verificadas con el servicio
pos habilitado. Cada cobro usa una dirección exclusiva (wallet efímera
del motor del link de cobro universal):
no hay riesgo de cruzar pagos entre cobros.Flujo completo
1. Registra el merchant (una vez por comercio)
Cada merchant nace amarrado a una verificación KYC/KYB de terceros aprobada — la identidad del comercio sale de ahí, no se declara a mano. Puedes fijarle una comisión informativa (fee_percent + fee_fixed):
no mueve dinero, pero la API la calcula en cada cobro pagado y el resumen te
dice el neto a repartirle.
GET /v1/pos/merchants (paginado) y GET /v1/pos/merchants/{id}.
Con PATCH /v1/pos/merchants/{id} cambias status (active/disabled — un
merchant deshabilitado no puede generar cobros nuevos), la comisión y el
external_ref. La identidad no se edita: viene de la verificación.
2. Genera el cobro (uno por venta)
El contrato es el mismo del link de cobro universal: el monto se expresa en tusettlement_asset (el default de tu cuenta si no lo mandas) y el due
que paga el cliente se cotiza en el crypto del QR al momento de crear el
cobro — si el cliente paga en un asset distinto al tuyo, la conversión ya
está incluida en el due (tú recibes tu meta exacta).
crypto:tron:usdt,eth:usdt,eth:usdcobtc:btc.expires_in: 300–86400 segundos (default 900). Cotizaciones con BTC se congelan 15 minutos (quote_expires_at).idempotency_keyes obligatoria: el retry con la misma clave devuelve el MISMO cobro y la MISMA dirección (idempotency_hit: true) — jamás se abre un segundo cobro por un reintento del POS.- El QR es la dirección cruda (compatible con Binance y todas las
wallets); imprime el
dueal lado.
3. Detecta el pago (polling o webhook)
Polling del POS:GET /v1/pos/charges/{charge_id} cada pocos segundos.
Apenas el depósito aparece on-chain (2-3 s típicos, ANTES de confirmar), la
respuesta trae la detección temprana:
confirming es señal de UX (“pago detectado, confirmando…”) — el crédito
real llega SOLO con la confirmación on-chain: status pasa a paid,
received refleja lo acumulado y paid_at queda estampado.
Webhook (recomendado para marcar la venta): payin_credited llega con el
bloque de atribución:
Estados del cobro
Pagos parciales: se acumulan (
received) hasta la meta; paid solo al
completarla. Pagos tardíos: si la plata llega DESPUÉS de expirar, se
acredita igual a tu cuenta (la dirección sigue viva) y el webhook se emite —
received del cobro expirado lo refleja para que concilies, jamás se pierde
un pago real. Sobrepagos (propinas): también se acreditan.
4. Concilia y reparte por merchant
GET /v1/pos/charges?from=…&to=…&merchant_id=… lista los cobros de cada
comercio (filtros merchant_id, status; paginación estándar).
GET /v1/pos/summary?from=…&to=… entrega el agregado POR MERCHANT — la vista
para liquidar con cada cliente:
gross es lo recaudado (la meta de los cobros pagados), processor_fee tu
comisión configurada en el merchant, y net_for_merchant lo que le debes
repartir (devoluciones en el mismo asset ya descontadas). El reparto lo haces
con los rieles existentes: transferencias,
payouts fiat o retiros crypto.
5. Devoluciones
POST /v1/pos/charges/{charge_id}/refund devuelve (parte de) lo recibido al
pagador como un retiro crypto normal desde tu saldo — con hold, fee de
retiro y todos los controles de compliance del riel.
to_addresses siempre explícita. Nunca devolvemos automático a la dirección de origen: puede ser la hot wallet de un exchange donde tu cliente no controla esa dirección (la plata se perdería). Pídele la dirección de devolución y confírmala; losfrom_addressrecibidos quedan en el detalle del cobro como referencia.- Tope duro: la suma de devoluciones de un cobro jamás puede superar lo
recibido (
422 refund_exceeds_received), incluso con requests concurrentes. - Aplica sobre cualquier cobro con pago recibido — incluido un cobro expirado que recibió un pago tardío (el caso más común de devolución).
- El monto se devuelve en el crypto del cobro: como el pago se convirtió
a tu settlement asset, necesitas saldo en ese crypto (haz un
swap de vuelta si te falta; el error es
insufficient_funds). - El estado sigue el ciclo del retiro (
pending→processing→completed/failed; un retiro fallido reembolsa tu débito y libera el tope). Consulta conGET /v1/pos/charges/{id}/refunds.
Errores propios
FAQ
¿Cuánto demora en confirmar el pago en el POS?
¿Cuánto demora en confirmar el pago en el POS?
La detección temprana (
confirming: true) aparece en 2-3 segundos. La
confirmación final depende de la red: TRON ~1 minuto, Ethereum unos minutos,
Bitcoin ~30 minutos. Tú decides si liberas la venta con confirming (riesgo
tuyo) o esperas el paid. Para POS recomendamos TRON/USDT.¿Puedo imprimir el QR en papel?
¿Puedo imprimir el QR en papel?
Sí —
qr_png_base64 está listo para imprimir y qr_payload es la dirección
cruda por si tu POS genera el QR localmente. Imprime el due y la red al
lado: el cliente debe enviar el monto exacto por la red correcta.¿Qué pasa si el cliente paga menos, más, o tarde?
¿Qué pasa si el cliente paga menos, más, o tarde?
Menos: el cobro queda
pending acumulando (received) hasta la meta. Más
(propina): el excedente también se acredita. Tarde (después de expirar): se
acredita igual con su webhook — el detalle del cobro expirado muestra el
received para que concilies. Nunca se pierde un pago real.¿El dinero queda a nombre del restaurant?
¿El dinero queda a nombre del restaurant?
No — todo se acredita a TU cuenta (el procesador), convertido a tu settlement
asset. La atribución por merchant (cobros, webhooks y summary) te dice
exactamente cuánto corresponde a cada comercio para que le repartas por el
riel que prefieras.
¿Qué comisiones aplican?
¿Qué comisiones aplican?
Cada pago acreditado paga el fee de
funding de tu cuenta (porcentual +
fijo) y, si el asset pagado difiere de tu settlement asset, la conversión
automática con su spread. La comisión por merchant (fee_percent/fee_fixed)
es tuya con tu cliente: informativa, no la cobramos nosotros.¿Un POS puede consultar el estado directo contra CBPay?
¿Un POS puede consultar el estado directo contra CBPay?
En esta versión el POS habla con TU backend y tu backend consulta con tu API
key (una máquina física no debe guardar tu key). Si necesitas POS sin backend
propio, cuéntanos: un token público de solo-lectura por cobro está en el
roadmap.