Saltar al contenido principal
Usa este flujo para cobrar pagos en moneda local (MXN, ARS, COP, BRL) de tus propios clientes hacia el saldo fiat de un comercio, también llamado saldo Pending Fund. Le das a cada pagador una cuenta virtual con sus propios datos bancarios, el pagador envía una transferencia local, y VelaFi abona el saldo del comercio y te envía un FUNDING_WEBHOOK que indica la cuenta virtual a la que llegó el dinero. Desde ese saldo puedes dispersar pagos, mover fondos a otro comercio o comprar cripto.

Cómo funciona

Una cuenta o una por pagador

Una cuenta virtual sirve solo para atribución. No tiene saldo propio: cada depósito, en cualquier cuenta virtual, se abona al saldo único de la cuenta de moneda del comercio. Lleva los saldos por pagador en tu propio libro contable, indexados por depositAlias.

Antes de empezar

Canales que admiten cuentas virtuales

El comercio ya debe tener una cuenta de moneda activa en ese canal. Una cuenta de moneda en un canal que no admite cuentas virtuales devuelve -5084 (esta moneda no admite múltiples cuentas virtuales). default, en cualquier combinación de mayúsculas y minúsculas, está reservado.

Paso a paso

1

Crea una cuenta virtual para cada pagador

Llama a POST /v2/merchant/virtual/accounts con el comercio, la moneda, el canal y un alias que tú elijas. Usa un ID estable de tu sistema, como tu ID de cliente, para que puedas relacionar los depósitos sin una tabla de búsqueda. El alias es permanente.
cURL
Response
status es 1 (pendiente) mientras el canal configura la cuenta, 2 cuando está activa y 3 si falló. Las cuentas ARS (63) devuelven 2 de inmediato. Enviar el mismo alias otra vez mientras está pendiente devuelve -5085; una vez que está activa, -5086.
2

Obtén los datos bancarios del alias

Consulta periódicamente GET /v2/merchant/virtual/addfunds con depositAlias hasta que el status del registro sea 2 y después lee su fieldList. Las claves dependen del canal y se listan en Claves de fieldList por método de pago.
cURL
Guarda los datos asociados al pagador. Los links de imágenes QR en fieldList expiran una hora después de la respuesta, así que obtén uno nuevo cada vez que lo vuelvas a mostrar. Para fondear la cuenta principal del comercio, llama a GET /v2/merchant/addfunds.
3

Muestra al pagador qué debe hacer

Muestra al pagador los datos de su alias. Lo que hace el pagador depende del riel:
4

Maneja el webhook de depósito

Cuando se abona el depósito, VelaFi crea un registro de fondeo de tipo DEPOSIT con status 2 y envía un FUNDING_WEBHOOK. Verifica el header signature, guarda el evento y devuelve HTTP 200 con {"callbackStatus":"SUCCESS"}. Abona al pagador identificado por depositAlias en tu libro contable. Consulta Webhooks que debes manejar.
5

Revisa el saldo

Lee el saldo del comercio con GET /v2/merchant/accounts: el balance del registro de esa moneda y ese canal. Este es el monto disponible para pagos, transferencias y órdenes de on-ramp.
cURL

Webhooks que debes manejar

Suscríbete a FUNDING_WEBHOOK. Un solo webhook recibe los eventos de todos los comercios de tu cuenta. Un evento de depósito se ve así (todos los valores son strings):
FUNDING_WEBHOOK (DEPOSIT)
La lista completa de campos está en Evento de fondeo.
Una entrega cuenta como exitosa solo cuando tu endpoint devuelve un status 2xx y el cuerpo JSON {"callbackStatus":"SUCCESS"}. Responde rápido: VelaFi espera como máximo 60 segundos, y un timeout cuenta como entrega fallida. Un SUCCESS simple, {"received":true}, un cuerpo vacío o tu propio JSON de error cuentan como fallas. Después de tres intentos fallidos el evento ya no se vuelve a enviar, y la Open API no tiene un endpoint de reenvío. Confirma primero y después procesa de forma asíncrona. Consulta Entrega y reintentos.

Maneja las fallas

  • Eventos duplicados o fuera de orden. El mismo evento puede llegar más de una vez, y un evento cuyo status cambió antes de la entrega se descarta. Haz que tu handler sea idempotente sobre eventType + txId + status, y lee el registro con Listar registros de fondeo cuando necesites su estado más reciente.
  • Webhooks perdidos. Si tu endpoint estaba caído o respondió de forma incorrecta, no se reenvía nada. Ejecuta la conciliación de abajo de forma programada para que no se pierda ningún depósito.
  • Depósito sin depositAlias. Los pagos a los datos de la cuenta principal del comercio, o los rieles que no reportan el alias, no tienen una cuenta virtual con la cual relacionarse. Retenlos para revisión manual usando los campos del pagador y bankWebhookInfo.
  • Falla la creación de la cuenta virtual. status 3 significa que el canal rechazó la cuenta. -5079 significa que la cuenta no está habilitada para esa moneda y ese canal, y -5071 significa que la cuenta de moneda del comercio en ese canal no está activa. Revisa la cuenta del comercio antes de reintentar.
  • Alias de COP rechazado. Para 68 y 69, el alias debe tener de 6 a 21 letras mayúsculas o dígitos.

Concilia

Los registros de fondeo son la fuente de verdad de lo que se abonó al saldo:
  • GET /v2/merchant/funding/records con type=DEPOSIT, un fiat y una ventana startTime/endTime (la ventana se aplica a la hora de finalización). Compara cada registro con status 2 contra los webhooks que guardaste y procesa los que te hayan faltado. En los depósitos, webhookInfo contiene los mismos detalles del proveedor que bankWebhookInfo, incluido depositAlias.
  • GET /v2/merchant/fiat/flows para el historial del saldo línea por línea: cada línea tiene el cambio (changed), el saldo acumulado (total) y el txId relacionado. Úsalo para comprobar que el saldo en Listar cuentas de comercio es igual a la suma de tus movimientos.
Los registros de fondeo devuelven 100 registros por página de forma predeterminada (hasta 20,000 con pageSize), y los flujos fiat hasta 1,000 por página. Recorre las páginas con currentPage.

Prueba en el sandbox

Usa https://api-test.velafi.com con credenciales de sandbox. Ahí puedes crear y listar cuentas virtuales, y abonar depósitos de prueba con el simulador de depósitos fiat (POST /v2/platform/test/deposit). Envía depositAlias para mandar el depósito a una cuenta virtual.
  • Los webhooks no se disparan en el sandbox. Prueba tu handler enviándole tú mismo payloads de ejemplo, y revisa el resultado de cada depósito simulado con Listar registros de fondeo.
  • El simulador solo produce depósitos exitosos. No puede producir un depósito fallido o devuelto.

Lista de verificación para salir a producción

  • El endpoint de FUNDING_WEBHOOK verifica la firma y devuelve HTTP 200 con {"callbackStatus":"SUCCESS"} rápidamente, muy por debajo del timeout de 60 segundos.
  • El handler es idempotente sobre eventType + txId + status e ignora los eventos que ya procesó.
  • Cada pagador tiene su propia cuenta virtual, y el alias corresponde a un solo cliente en tu sistema.
  • Tu libro contable lleva los saldos por pagador; no esperas que VelaFi mantenga un saldo por cuenta virtual.
  • Los depósitos sin depositAlias van a una cola de revisión.
  • Un proceso programado compara los registros de fondeo (type=DEPOSIT) con los webhooks guardados y procesa los faltantes.
  • Los códigos QR y los links de pago se obtienen de nuevo antes de mostrarse.
Consulta también la lista de verificación general para salir a producción.