clientId y la falta de un proceso de conciliación que detecte lo que los webhooks no entregaron.
Credenciales y autenticación
- Mantén separadas las credenciales de sandbox y de producción. Las claves de sandbox las proporciona VelaFi y se usan con
https://api-test.velafi.com. Las claves de producción se crean en la página Gestión de API y se usan conhttps://api.velafi.com. Los dos conjuntos no son intercambiables. Consulta Claves de sandbox y de producción. - Agrega a la lista blanca de IP de la clave la dirección IP pública de cada servidor de producción que llame a la API (hasta 5 direcciones por clave, sin rangos CIDR). Una clave sin lista blanca no puede obtener un token (
-1023), y las llamadas desde otras direcciones fallan con-2015(solicitud de token) o-2019(llamada a la API). Actualiza la lista antes de cambiar de servidores o de IP de salida. - Mantén la clave de API, el secreto de API y los tokens en tu servidor. Nunca los pongas en código de navegador o móvil, en logs ni en el control de versiones.
- Guarda el token en caché y solicita uno nuevo antes de su
expireTime(milisegundos Unix). Si una llamada devuelve-1022, el token expiró o es desconocido: obtén un token nuevo y envía la llamada otra vez. - Planea la rotación de claves: crea la clave nueva, agrega sus IP a la lista blanca, haz el cambio y después elimina la clave anterior. Consulta Buenas prácticas de seguridad.
Webhooks
Los webhooks no se disparan en el sandbox, así que producción es el primer lugar donde tu handler recibe entregas reales. Revísalo con cuidado.- Registra un webhook de producción para cada tipo de evento que uses con Crear un webhook (
POST /v2/webhook), usando tus credenciales de producción. Cada tipo de evento (ORDER_WEBHOOK,GLOBAL_PAYMENT_WEBHOOK,FUNDING_WEBHOOK,ON_RAMP_WITHDRAW_WEBHOOK,CRYPTO_WITHDRAW_WEBHOOK,STABLE_COIN_PAYMENT_WEBHOOK) necesita su propio registro. Los eventos que ocurren mientras no existe un webhook activo para su tipo no se ponen en cola, así que regístralo antes de tu primera transacción real. - Guarda la
publicKeyde cada webhook y verifica el headersignatureRSA-SHA256 contra los bytes del cuerpo crudo de la solicitud, antes de parsear o volver a serializar el JSON. Consulta Configuración de webhooks. - Confirma cada entrega que aceptes con HTTP
2xxy exactamente este cuerpo JSON. Si la verificación de la firma falla, devuelve{"callbackStatus":"FAIL"}para que la entrega se reintente.
- Responde rápido. Verifica la firma, guarda el evento, devuelve la confirmación y haz el trabajo lento (actualizaciones de base de datos, llamadas a otros sistemas) de forma asíncrona.
- Maneja los duplicados. El mismo evento puede llegar más de una vez. Haz que el procesamiento sea idempotente sobre el tipo de evento, el ID del registro (
orderId,txIdowithdrawId) y el status. - No dependas del orden ni de ver cada estado. Las entregas pueden llegar fuera de orden, y un estado intermedio se puede omitir cuando el registro ya avanzó. Trata un webhook como una señal: lee el estado actual del registro con el endpoint de consulta correspondiente y actúa con base en eso.
- Concilia lo que los webhooks no entregan. Una entrega fallida se intenta 3 veces en total (el segundo intento entre 5 y 10 minutos después del primero, y el tercero entre 60 y 65 minutos después del segundo). Después de eso, el evento se descarta, y la API no tiene un endpoint de reenvío. Ejecuta el proceso de conciliación descrito abajo.
- Prueba la respuesta de tu handler antes de salir a producción. Envía un payload de ejemplo a tu propio endpoint y verifica que la respuesta cruda sea exactamente
{"callbackStatus":"SUCCESS"}con un status2xx.
Idempotencia con clientId
Envía un clientId nuevo y único en cada llamada que cree algo, guárdalo antes de enviar la solicitud y reutiliza el mismo valor cuando reintentes esa solicitud. VelaFi rechaza un clientId reutilizado en lugar de crear un segundo registro. La respuesta de duplicado no devuelve el registro original, así que búscalo.
Un
clientId queda vinculado a su registro de forma permanente, incluso después de que el registro se cancele. Usa un valor nuevo para una operación nueva.
Crear un comercio no tiene clientId. Antes de reintentarlo, busca el comercio por email con Listar comercios (status=-1).
Manejo de errores
- Toma decisiones con base en el campo
code, no en el status HTTP. Los errores usan HTTP400(o500para-1001) con uncodenegativo (excepto30012). No existen401ni429. Consulta Códigos de error. - Trata
-1001,-1006,-1007y30012en una llamada que crea o modifica algo como resultado desconocido. Es posible que la operación se haya completado. Búscala porclientId(tabla de arriba) y reintenta con el mismoclientIdsolo si no encuentras nada. Un-1174en ese reintento significa que la primera solicitud sí se procesó. - No hagas coincidencias sobre
msg. Puede contener valores de tiempo de ejecución y marcadores de posición. - Espera antes de reintentar (backoff) ante
-1006de un endpoint con límite de tasa y ante30012(demasiadas solicitudes simultáneas). - Para las órdenes fallidas, lee
failCodeyfailReasoncon Obtener una orden.failReasonpuede estar vacío o contener el texto crudo del proveedor, así que regístralo en logs y maneja la orden según su estado.
Conciliación
Los webhooks son un canal de notificación, no tu libro contable. Ejecuta un proceso programado que lea los registros de VelaFi de las últimas horas o días y los compare con los tuyos.- Vuelve a revisar cada registro que tu sistema tenga en un estado no final, para que un webhook perdido no deje una orden o un pago pendiente de tu lado para siempre.
- Genera alertas para los registros que permanezcan en un estado no final más tiempo del que esperas para ese riel.
- Concilia los saldos a diario: el saldo inicial más los registros de fondeo debe ser igual al saldo final.
Límites
- Revisa los límites diarios y mensuales de cada comercio y su uso (
dayFiatLimit,monthFiatLimit,monthCryptoLimity los campos...Usedcorrespondientes) con Listar comercios, y los límites por canal (monthBuyLimit,monthSellLimit) con Listar cuentas de comercio. - Maneja los errores de límites:
-5050y-5060(orden por debajo del mínimo o por encima del máximo),-5029,-5030y-5081(límite mensual o diario excedido). - Solicita límites más altos antes del lanzamiento si tu volumen esperado los necesita. Consulta Límites de transacción.
- Respeta los límites de tasa de los endpoints de cotizaciones y órdenes.
Monitoreo
- Registra en logs cada solicitud y respuesta con tu
clientIdy el ID de VelaFi (orderId,txId,withdrawId), para que puedas rastrear cualquier transacción. - Genera alertas ante fallas de token (
-1022,-1023,-2015,-2019). Normalmente significan un token expirado, una clave deshabilitada o una IP que no está en la lista blanca. - Genera alertas cuando dejen de llegar entregas de webhooks o cuando tu handler devuelva algo distinto de la confirmación.
- Genera alertas ante tasas de error crecientes, códigos de resultado desconocido y órdenes o pagos atorados en estados no finales.
- Vigila los saldos desde los que pagas (saldo fiat para pagos y órdenes prefondeadas, saldo cripto para off-ramps) para que los pagos no fallen por falta de fondos.
Por caso de uso
Cada página de caso de uso termina con una lista de verificación para su propio flujo. Completa la de cada flujo que lances:Cobrar con cuentas virtuales
Cuenta virtual por pagador, manejo de
FUNDING_WEBHOOK, conciliación de depósitos por depositAlias.Dispersar desde tu saldo
Beneficiarios, revisión de saldo y comisiones, seguimiento del estado de los pagos.
Convertir a stablecoins
Órdenes de on-ramp prefondeadas o de pago por orden, cotizaciones, manejo de la expiración.
Dispersar fondeado con stablecoins
Órdenes de off-ramp, saldo cripto, fallas de pagos y reembolsos.
Dar de alta a tus clientes
Creación de comercios, estado de verificación, activación de canales.
Pagos transfronterizos
Órdenes de fiat a fiat con
GLOBAL_PAYMENT_WEBHOOK.