API de Vizum
Conecta tu ERP, tesorería o plataforma con Vizum para consultar saldos, dar de alta beneficiarios y crear pagos nacionales e internacionales sin entrar al panel.
La API es REST sobre HTTPS, recibe y devuelve JSON, y es un espejo del panel de Vizum: lo que tu sistema hace por API es exactamente lo que tu equipo puede hacer en el panel, con los mismos permisos, las mismas comisiones y la misma revisión.
Antes de empezar
- Todo pago pasa por la revisión de Vizum. Crear un pago lo deja en
pending; Vizum lo revisa y lo envía. Igual que en el panel, un cliente no puede ejecutar el envío por su cuenta. - El tipo de cambio es indicativo. No existe una cotización con folio ni vencimiento: el pago toma el tipo de cambio vigente al crearse. Ver Montos y tipo de cambio.
- Toda escritura lleva
Idempotency-Key. Es obligatorio. Ver Idempotencia.
Ambientes
Hay dos ambientes, cada uno con sus propias llaves. Una llave de pruebas no funciona en producción ni al revés.
| Ambiente | URL base | Uso |
|---|---|---|
| Pruebas | https://dev.open.vizum.mx/v1 | Integración y pruebas. No mueve dinero real. |
| Producción | https://open.vizum.mx/v1 | Operación real. |
Todas las rutas de esta documentación son relativas a la URL base. Por ejemplo, GET /accounts es GET https://open.vizum.mx/v1/accounts.
Llama a la API desde tu servidor. No pongas tu llave en código que corra en el navegador de tus usuarios: quien la vea puede operar con ella.
Autenticación
Cada llamada se autentica con una llave de API en el header X-Api-Key. Las llaves empiezan con vzk_.
curl https://open.vizum.mx/v1/accounts \
-H "X-Api-Key: vzk_tu_llave"Crear una llave
Vizum habilita la API por cuenta. Si en Configuración → API y Webhooks la sección API keys dice Próximamente, tu cuenta todavía no la tiene: pídele a tu ejecutivo de Vizum que la active.
- Entra al panel de Vizum y ve a Configuración → API y Webhooks → API keys.
- Ponle un nombre, elige sus alcances y, si quieres, las IPs desde las que va a funcionar y una vigencia en días (hasta 3,650).
- Copia la llave. Se muestra una sola vez: Vizum guarda sólo su huella y después únicamente ve sus primeros caracteres. Si la pierdes, revócala y crea otra.
La llave actúa a nombre del usuario que la creó: alcanza las mismas cuentas que ese usuario y nunca más permisos que los que tiene en el panel. Si el usuario deja de estar activo, sus llaves dejan de funcionar.
Alcances
Cada llave lleva una lista de alcances. Una ruta exige un alcance concreto, y leer no habilita escribir: una llave de sólo lectura no puede mover dinero ni cambiar a quién se le paga.
| Alcance | Permite |
|---|---|
accounts:read | Listar cuentas. |
wallets:read | Listar wallets y saldos. |
exchange-rate:read | Consultar tipos de cambio. |
beneficiaries:read | Listar beneficiarios. |
transactions:read | Listar y consultar pagos, calcular comisiones. |
beneficiaries:create | Consultar requisitos por corredor y crear beneficiarios. escritura |
beneficiaries:update | Editar beneficiarios. escritura |
transactions:create | Crear pagos. escritura |
transactions:send | Fondear un pago diferido. escritura |
Para escribir no basta el alcance de la llave: el usuario dueño de la llave también tiene que tener ese permiso en la cuenta, igual que en el panel.
Restricción por IP
Puedes limitar una llave a una lista de hasta 50 IPs o rangos CIDR (por ejemplo 203.0.113.10 o 203.0.113.0/24). Una lista vacía significa sin restricción. La lista se puede cambiar desde el panel sin volver a emitir la llave. Recomendamos usarla siempre en producción.
Respuestas de autenticación
| Estatus | Cuándo |
|---|---|
401 | Falta la llave, no existe, está revocada o vencida, o la llamada viene de una IP no permitida. Siempre con el mismo mensaje, Missing or invalid API key, para no revelar cuál de los casos es. |
403 SCOPE_DENIED | La llave no tiene el alcance que pide la ruta. El campo scope dice cuál falta. |
403 PERMISSION_DENIED | La llave tiene el alcance, pero su usuario no tiene ese permiso en esa cuenta. |
403 ACCOUNT_NOT_AVAILABLE | La cuenta no es alcanzable con esta llave, o no está activa. |
Guía rápida: tu primer pago
El flujo completo, de la llave al pago, usando el ambiente de pruebas.
- Encuentra tu cuenta.
GET /accountsdevuelve tus razones sociales. Guarda elidde la que va a pagar. - Elige la wallet de origen.
GET /accounts/{accountId}/walletste da las wallets de esa cuenta, su moneda y su saldo. - Pregunta qué datos pide el corredor.
POST /accounts/{accountId}/beneficiary-requirementscon país, moneda y tipo de entidad. Dibuja tu formulario con lo que regrese; no supongas campos. - Da de alta al beneficiario.
POST /accounts/{accountId}/beneficiariescon esos datos endetails. Siregistrationviene enready, ya le puedes pagar. - Cotiza.
GET /accounts/{accountId}/exchange-ratespara el tipo de cambio indicativo yPOST /accounts/{accountId}/transactions/calculate-feepara las comisiones. - Crea el pago.
POST /accounts/{accountId}/transactionscon unIdempotency-Keynuevo. Queda enpending, esperando la revisión de Vizum. - Si es diferido, fondéalo. Un pago con
isPayLater: trueno debita la wallet hasta que llamasPOST .../pay-now. - Sigue su estatus. Consulta
GET /transactions/{transactionId}hasta que llegue a un estatus final. Su línea de tiempo viene enevents.
# 1. Tu cuenta
curl https://dev.open.vizum.mx/v1/accounts -H "X-Api-Key: $VIZUM_KEY"
# 2. Sus wallets
curl https://dev.open.vizum.mx/v1/accounts/$ACCOUNT_ID/wallets -H "X-Api-Key: $VIZUM_KEY"
# 6. El pago (una llave de idempotencia nueva por pago)
curl -X POST https://dev.open.vizum.mx/v1/accounts/$ACCOUNT_ID/transactions \
-H "X-Api-Key: $VIZUM_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"walletId": "'$WALLET_ID'",
"beneficiaryId": "'$BENEFICIARY_ID'",
"sourceCurrencyCode": "MXN",
"sourceAmount": "15000.00",
"concept": "Factura 1042"
}'Idempotencia
Toda escritura (crear o editar beneficiario, crear pago, fondear pago diferido) exige el header Idempotency-Key. Sin él la API responde 400 IDEMPOTENCY_KEY_REQUIRED y no ejecuta nada.
Genera un valor único por operación (un UUID sirve, hasta 255 caracteres) y repite el mismo valor si reintentas. Así, si tu sistema reintenta por un timeout sin saber si el pago se creó, el reintento no crea un segundo pago.
| Situación | Respuesta |
|---|---|
| Llave nueva | Se ejecuta la operación. |
| Misma llave, mismo cuerpo, operación terminada | Se devuelve la respuesta original sin volver a ejecutar, con el header Idempotent-Replay: true. |
| Misma llave, mismo cuerpo, operación en curso | 409 IDEMPOTENCY_KEY_IN_FLIGHT. No se ejecutó de nuevo; consulta el estado antes de reintentar. |
| Misma llave, cuerpo distinto | 409 IDEMPOTENCY_KEY_REUSED. Usa una llave nueva por operación. |
| Llave de más de 255 caracteres | 400 IDEMPOTENCY_KEY_TOO_LONG. |
Si la operación falla (por ejemplo, un dato inválido), la llave se libera: corriges y reintentas con la misma. Las llaves se aíslan por cuenta y por endpoint, y el orden de los campos del JSON no importa.
Las consultas que usan POST sólo porque llevan cuerpo (beneficiary-requirements y calculate-fee) no escriben nada y no piden la llave.
Límites de uso
Cada llave tiene un presupuesto de 120 llamadas por minuto. El límite es por cliente, no por IP. Cada respuesta trae el estado de tu presupuesto:
x-ratelimit-limit-whitelabel: 120
x-ratelimit-remaining-whitelabel: 119
x-ratelimit-reset-whitelabel: 60Al agotarlo la API responde 429. Espera los segundos que indica x-ratelimit-reset-whitelabel antes de reintentar.
Cada respuesta trae también x-request-id. Inclúyelo si nos escribes a soporte por una llamada concreta.
Paginación
Las listas de beneficiarios y de pagos son paginadas, del más reciente al más antiguo.
| Parámetro | Descripción |
|---|---|
pageentero, desde 1 | Página a devolver. Por omisión, 1. |
limitentero, 1 a 100 | Elementos por página. Por omisión, 30. |
{
"data": [ ... ],
"total": 57,
"page": 1,
"limit": 30,
"totalPages": 2
}Un parámetro que la ruta no reconoce se rechaza con 400 en vez de ignorarse.
Errores
Los errores usan los códigos HTTP estándar y un cuerpo JSON. Siempre traen statusCode, message, requestId, path y timestamp, salvo el 404 de una ruta que no existe, que sólo trae statusCode y message. Según el error, traen además uno de estos identificadores estables, que es en lo que debe basarse tu código:
reason: errores de acceso, idempotencia y validación de la API (por ejemploSCOPE_DENIED), a veces con campos extra comoscopeoaccountId.codeyuserMessage: errores de negocio al operar (saldo, beneficiario, pago).userMessageestá pensado para mostrarse a tu usuario.
{
"statusCode": 403,
"message": "Esa cuenta no está disponible para esta credencial. Si es una razón social tuya, cada cuenta se habilita por separado: revisa que su onboarding esté completo y que la cuenta esté activa.",
"reason": "ACCOUNT_NOT_AVAILABLE",
"accountId": "0a0a0a0a-0000-4000-8000-000000000000",
"requestId": "66c567eb-ed6e-424d-8c28-d0eca9986385",
"path": "/api/v1/whitelabel/accounts/0a0a0a0a-0000-4000-8000-000000000000/wallets",
"timestamp": "2026-10-27T10:48:02.855Z"
}{
"statusCode": 422,
"code": "TRANSACTION_NOT_PROCESSABLE",
"message": "No se pudo procesar esta operación con los datos enviados. Verifica los datos o intenta de nuevo más tarde.",
"userMessage": "No se pudo procesar esta operación con los datos enviados. Verifica los datos o intenta de nuevo más tarde.",
"requestId": "…",
"path": "…",
"timestamp": "…"
}Cuando la validación del cuerpo o de los parámetros falla, message es una lista con cada problema, por ejemplo ["property foo should not exist"].
Códigos HTTP
| Estatus | Significado |
|---|---|
200 201 | Éxito. 201 cuando se creó un beneficiario o un pago. |
400 | Cuerpo o parámetros inválidos, identificador que no es UUID, o falta Idempotency-Key. |
401 | Llave ausente, inválida, revocada, vencida o desde una IP no permitida. |
403 | Sin alcance, sin permiso, o cuenta no disponible. |
404 | El recurso no existe o no es tuyo (son la misma respuesta), la ruta no existe, o el corredor no está disponible. |
409 | Conflicto de idempotencia. |
422 | La operación no se pudo procesar con los datos enviados. |
429 | Se agotó el límite por minuto. |
500 | Error nuestro. Puedes reintentar; en escrituras, con la misma Idempotency-Key. |
Identificadores de error de la API
| Identificador | Estatus | Qué hacer |
|---|---|---|
SCOPE_DENIED | 403 | Agrega el alcance indicado en scope a la llave, o usa otra. |
PERMISSION_DENIED | 403 | Pide a un administrador de la cuenta que le dé ese permiso al usuario dueño de la llave. |
ACCOUNT_NOT_AVAILABLE | 403 | Revisa el accountId, que su onboarding esté completo y que la cuenta esté activa. |
IDEMPOTENCY_KEY_REQUIRED | 400 | Manda el header Idempotency-Key. |
IDEMPOTENCY_KEY_TOO_LONG | 400 | Usa una llave de hasta 255 caracteres. |
IDEMPOTENCY_KEY_IN_FLIGHT | 409 | Consulta el estado antes de reintentar. |
IDEMPOTENCY_KEY_REUSED | 409 | Usa una llave nueva para una operación nueva. |
AMOUNT_ANCHOR_AMBIGUOUS | 400 | Manda sourceAmount o targetAmount, no los dos. |
CORRIDOR_NOT_AVAILABLE | 404 | Todavía no se puede pagar a ese país en esa moneda para ese tipo de entidad. |
Estatus de un pago
| Estatus | Significado |
|---|---|
pending | Creado y esperando la revisión de Vizum. Si no es diferido, la wallet ya se debitó. |
funded | Pago diferido ya fondeado con pay-now; espera la revisión de Vizum. |
in_progress | Aprobado y en camino al banco del beneficiario. |
awaiting_funds | En proceso; los fondos todavía no se han liquidado. |
filled | Liquidado. A partir de aquí el pago tiene su folio en publicId. final |
rejected | Rechazado en la revisión. final |
failed | No se pudo completar. final |
canceled | Cancelado. final |
expired | Venció sin completarse; por ejemplo, un pago diferido que no se fondeó a tiempo. final |
returned | El banco del beneficiario devolvió el pago. final |
refunded | Reembolsado. final |
La API no envía notificaciones de cambio de estatus: consulta GET /transactions/{transactionId} periódicamente mientras el pago no esté en un estatus final. Un intervalo de uno o dos minutos sobra; respeta los límites de uso.
Montos y tipo de cambio
- Los montos son cadenas, no números:
"15000.00". Así no se pierden centavos en montos grandes. Mándalos igual. - Monedas en ISO 4217 (
MXN,USD,EUR) y países en ISO 3166-1 alfa-2 (MX,US). - Fechas en ISO 8601, UTC.
- Un pago se ancla por un solo lado. Manda
sourceAmount(lo que sale de tu wallet) otargetAmount(lo que le llega al beneficiario). El otro lo calcula Vizum con el tipo de cambio del momento. - El tipo de cambio es indicativo.
indicativeRateya incluye el margen de tu cuenta y es el que se aplicaría si creas el pago en ese momento.validUntiles la vigencia del dato en caché, no un precio garantizado. Si necesitas certeza del monto que sale, ancla el pago consourceAmount. nullsignifica "no aplica" o "no hay dato", nunca cero. Una comisión ennullno es una comisión de cero pesos.
Versionado
La versión va en la ruta: /v1. Dentro de una versión sólo hacemos cambios compatibles: agregar endpoints, agregar campos a las respuestas o agregar parámetros opcionales. Tu integración debe ignorar los campos que no conozca. Quitar o renombrar un campo, o cambiar su tipo, sólo ocurre en una versión nueva.
Listar cuentas
accounts:readLas razones sociales que alcanza tu llave. Un mismo usuario puede operar varias cuentas, cada una con su RFC y sus wallets. Sólo aparecen las cuentas activas.
Respuesta
| Campo | Descripción |
|---|---|
iduuid | Identificador de la cuenta. Es el accountId del resto de las rutas. |
namestring | Razón social. |
rfcstring | null | RFC, o null si todavía no está capturado. |
curl https://open.vizum.mx/v1/accounts \
-H "X-Api-Key: $VIZUM_KEY"[
{
"id": "0196f2a1-4c3e-7b10-9d2a-5e8f1c0a7b21",
"name": "EMPRESA EJEMPLO SA DE CV",
"rfc": "EEJ200101AB1"
}
]Wallets de una cuenta
wallets:readLas wallets de una cuenta, una por moneda o por cuenta bancaria, con su saldo.
Respuesta
| Campo | Descripción |
|---|---|
iduuid | Identificador de la wallet. Es el walletId al crear un pago. |
accountIduuid | Cuenta a la que pertenece. |
namestring | Nombre de la wallet. |
currencystring | Moneda, ISO 4217. |
balancestring | Saldo disponible, en la moneda de la wallet. |
accountNumberstring | Número de cuenta para fondearla; en MXN, la CLABE. |
curl https://open.vizum.mx/v1/accounts/$ACCOUNT_ID/wallets \
-H "X-Api-Key: $VIZUM_KEY"[
{
"id": "0196f2a1-8e44-7c02-b1f3-2a6d9e4c0f58",
"accountId": "0196f2a1-4c3e-7b10-9d2a-5e8f1c0a7b21",
"name": "Principal MXN",
"currency": "MXN",
"balance": "250000.000000000000000000",
"accountNumber": "646180000000000001"
}
]Todas las wallets
wallets:readLas wallets de todas tus cuentas en una sola llamada, cada una con su accountId. Útil para conciliar el panorama completo sin pedir cuenta por cuenta. Misma forma que Wallets de una cuenta.
curl https://open.vizum.mx/v1/wallets \
-H "X-Api-Key: $VIZUM_KEY"Tipos de cambio
exchange-rate:readLos tipos de cambio vigentes para la cuenta. Las llaves de rates tienen la forma DIVISA/BASE: USD/MXN es cuántos MXN cuesta un USD.
Indicativo. No es una cotización con folio. El pago toma el tipo de cambio vigente cuando se crea.
Respuesta
| Campo | Descripción |
|---|---|
baseCurrencystring | Moneda base de la cuenta. |
rates[par].indicativeRatenumber | Tipo de cambio que se aplicaría a tu cuenta, con su margen incluido. |
rates[par].spotnumber | null | Tipo de cambio de referencia, sin margen. |
rates[par].lastUpdatedfecha | Cuándo se actualizó. |
rates[par].validUntilfecha | Vigencia del dato en caché. No es un precio garantizado. |
curl https://open.vizum.mx/v1/accounts/$ACCOUNT_ID/exchange-rates \
-H "X-Api-Key: $VIZUM_KEY"{
"baseCurrency": "MXN",
"rates": {
"USD/MXN": {
"indicativeRate": 19.15,
"spot": 18.59,
"lastUpdated": "2026-10-27T10:45:41.619Z",
"validUntil": "2026-10-27T10:47:41.619Z"
},
"EUR/MXN": {
"indicativeRate": 21.35,
"spot": 20.72,
"lastUpdated": "2026-10-27T10:45:41.619Z",
"validUntil": "2026-10-27T10:47:41.619Z"
}
}
}Listar beneficiarios
beneficiaries:readA quién le puedes pagar, con su país, moneda, banco y número de cuenta. Siempre la versión vigente de cada beneficiario. Paginada.
Parámetros de consulta
| Parámetro | Descripción |
|---|---|
accountIduuid, opcional | Sólo los beneficiarios de esa cuenta. Sin él, los de todas tus cuentas. |
page, limit | Ver Paginación. |
El objeto beneficiario
| Campo | Descripción |
|---|---|
iduuid | Identificador. Es el beneficiaryId al crear un pago. |
accountIduuid | Cuenta en la que está dado de alta. |
namestring | null | Nombre o razón social. |
countrystring | null | País, ISO 3166-1 alfa-2. |
currencystring | null | Moneda en la que recibe, ISO 4217. |
bankstring | null | Banco. |
accountNumberstring | null | CLABE, IBAN o número de cuenta. |
railstring | null | Riel de pago: SPEI, SWIFT, ACH… |
statusstring | pending, active, inactive o rejected. |
curl "https://open.vizum.mx/v1/beneficiaries?accountId=$ACCOUNT_ID&limit=50" \
-H "X-Api-Key: $VIZUM_KEY"{
"data": [
{
"id": "01a2b3c4-0000-7000-8000-00000000b001",
"accountId": "0196f2a1-4c3e-7b10-9d2a-5e8f1c0a7b21",
"name": "Comercializadora del Norte SA de CV",
"country": "MX",
"currency": "MXN",
"bank": "BANORTE",
"accountNumber": "072180012345678901",
"rail": "SPEI",
"status": "active"
}
],
"total": 1,
"page": 1,
"limit": 50,
"totalPages": 1
}Requisitos por corredor
beneficiaries:createQué datos hay que pedir para dar de alta a un beneficiario en un país y moneda. Es el mismo catálogo que usa el panel. Construye tu formulario con esta respuesta en vez de suponer campos: un alta con datos bancarios incompletos se crea, pero no se le puede pagar.
Es una consulta: no escribe nada y no lleva Idempotency-Key.
Cuerpo
| Campo | Descripción |
|---|---|
countryCoderequeridostring | País del beneficiario, ISO 3166-1 alfa-2. |
currencyCoderequeridostring | Moneda en la que recibe, ISO 4217. |
entityTyperequeridostring | individual (persona física) o business (empresa). |
railstring, opcional | Si ya elegiste un riel (SPEI, SWIFT, ACH…), acota los campos a los de ese riel. |
Respuesta
| Campo | Descripción |
|---|---|
fields | Todos los campos. Cada uno con canonicalFieldId (la llave que va en details al crear el beneficiario), type (text, select, email, phone, date), label, required y, según el caso, placeholder, validation (regex, minLength, maxLength), options, defaultValue, order y groupId. |
fieldGroups | Los mismos campos agrupados por sección (cuenta, titular, banco, domicilio…), en orden, para dibujar el formulario. |
availableRails | Rieles disponibles para el corredor. |
defaultValues | Valores sugeridos por campo. |
metadata | País, moneda y tipo de entidad consultados, y generatedAt. |
Campos condicionales
Un campo puede traer showWhen (mostrarlo sólo si se cumple) o requiredWhen (exigirlo sólo si se cumple). Cada condición es { field, operator, value } con operator en equals, notEquals, in, notIn o matches, y puede anidar and u or. Varias condiciones en la lista se cumplen todas a la vez.
Si el corredor no está disponible: 404 CORRIDOR_NOT_AVAILABLE.
curl -X POST https://open.vizum.mx/v1/accounts/$ACCOUNT_ID/beneficiary-requirements \
-H "X-Api-Key: $VIZUM_KEY" \
-H "Content-Type: application/json" \
-d '{
"countryCode": "MX",
"currencyCode": "MXN",
"entityType": "business"
}'{
"fieldGroups": [ ... ],
"fields": [
{
"canonicalFieldId": "businessName",
"type": "text",
"label": "Business Name",
"placeholder": "e.g., Acme Corporation",
"category": "accountHolder",
"required": true,
"validation": { "minLength": 2, "maxLength": 100 },
"order": 13
},
{
"canonicalFieldId": "clabeNumber",
"type": "text",
"required": true,
"showWhen": [
{ "field": "countryCode", "operator": "equals", "value": "MX" }
],
"validation": { "regex": "^\\d{18}$" },
…
},
{
"canonicalFieldId": "bankName",
"type": "select",
"required": true,
"options": [
{ "value": "ABC CAPITAL", "label": "ABC CAPITAL" },
…
],
…
}
],
"availableRails": ["SPEI", "LOCAL", "SWIFT"],
"metadata": {
"countryCode": "MX",
"currencyCode": "MXN",
"entityType": "business",
"generatedAt": "2026-10-27T10:49:21.407Z"
},
"defaultValues": {}
}Crear beneficiario
beneficiaries:create · Requiere Idempotency-KeyDa de alta a quién le vas a pagar, en la cuenta de la ruta. Pasa por las mismas validaciones que un alta desde el panel.
Cuerpo
| Campo | Descripción |
|---|---|
countryCoderequeridostring | País del beneficiario, ISO 3166-1 alfa-2. |
currencyCoderequeridostring | Moneda en la que recibe, ISO 4217. |
entityTyperequeridostring | individual o business. |
detailsrequeridoobjeto | Los datos del beneficiario, con las llaves canonicalFieldId que devolvió Requisitos por corredor para ese país, moneda y tipo de entidad. |
Respuesta 201
| Campo | Descripción |
|---|---|
beneficiary | El objeto beneficiario, igual que en la lista. |
registrationstring | ready: ya se le puede pagar. pending: el alta se sigue procesando. partial: quedó dado de alta pero algunos de sus datos bancarios no se aceptaron; revísalos y corrígelos con Editar beneficiario. |
curl -X POST https://open.vizum.mx/v1/accounts/$ACCOUNT_ID/beneficiaries \
-H "X-Api-Key: $VIZUM_KEY" \
-H "Idempotency-Key: 6f1c9e2a-3b7d-4c55-9a10-2e8f4d7b1c03" \
-H "Content-Type: application/json" \
-d '{
"countryCode": "MX",
"currencyCode": "MXN",
"entityType": "business",
"details": {
"currencyCode": "MXN",
"businessName": "Comercializadora del Norte SA de CV",
"rfc": "CNO150312AB4",
"bankName": "BANORTE",
"clabeNumber": "072180012345678901",
"selectedRail": "SPEI"
}
}'{
"beneficiary": {
"id": "01a2b3c4-0000-7000-8000-00000000b001",
"accountId": "0196f2a1-4c3e-7b10-9d2a-5e8f1c0a7b21",
"name": "Comercializadora del Norte SA de CV",
"country": "MX",
"currency": "MXN",
"bank": "BANORTE",
"accountNumber": "072180012345678901",
"rail": "SPEI",
"status": "active"
},
"registration": "ready"
}Editar beneficiario
beneficiaries:update · Requiere Idempotency-KeyCorrige los datos de un beneficiario y vuelve a procesar su alta, que es lo que esperas al corregir una cuenta bancaria. La versión anterior queda en la bitácora del beneficiario.
details reemplaza todo. No se mezcla con lo que había: si mandas sólo el campo que cambió, se borran los demás. Manda el objeto completo con el cambio aplicado.
Cuerpo
| Campo | Descripción |
|---|---|
detailsrequeridoobjeto | Los datos completos del beneficiario. |
changeReasonstring, opcional | Motivo del cambio, hasta 500 caracteres. Queda en la bitácora. |
Respuesta 200
Misma forma que Crear beneficiario. Después de una edición, registration viene en pending mientras se procesa de nuevo.
curl -X PATCH https://open.vizum.mx/v1/accounts/$ACCOUNT_ID/beneficiaries/$BENEFICIARY_ID \
-H "X-Api-Key: $VIZUM_KEY" \
-H "Idempotency-Key: 0b8e1d44-71f2-4a3c-8e6d-5c2a9f0e7b12" \
-H "Content-Type: application/json" \
-d '{
"details": {
"currencyCode": "MXN",
"businessName": "Comercializadora del Norte SA de CV",
"rfc": "CNO150312AB4",
"bankName": "BBVA MEXICO",
"clabeNumber": "012180001234567891",
"selectedRail": "SPEI"
},
"changeReason": "Cambio de cuenta bancaria"
}'Calcular comisión
transactions:readLas comisiones de tu tarifario que aplicarían a un pago antes de crearlo. Son las mismas que se cobran al crearlo. Es una consulta: no lleva Idempotency-Key.
Cuerpo
| Campo | Descripción |
|---|---|
amountrequeridostring | Monto de origen. |
currencyCoderequeridostring | Moneda de origen, ISO 4217. |
regionConditionrequeridostring | País destino, ISO 3166-1 alfa-2 (por ejemplo US). |
railstring, opcional | Riel del pago. |
destinationClabestring, opcional | CLABE destino, para pagos nacionales. |
isRefundboolean, opcional | Si es un reembolso. |
Respuesta
applicableFees: lista de comisiones que aplican. Cada una trae fixedFeeAmount y fixedFeeCurrency, y las condiciones bajo las que aplica (regionCondition, rail, currencyCode, umbrales de monto). Una lista vacía significa que tu tarifario no tiene comisiones para ese pago.
curl -X POST https://open.vizum.mx/v1/accounts/$ACCOUNT_ID/transactions/calculate-fee \
-H "X-Api-Key: $VIZUM_KEY" \
-H "Content-Type: application/json" \
-d '{
"amount": "10000.00",
"currencyCode": "MXN",
"regionCondition": "US",
"rail": "SWIFT"
}'{
"applicableFees": []
}Crear pago
transactions:create · Requiere Idempotency-KeyCrea un pago desde una wallet de la cuenta hacia un beneficiario. Queda en pending esperando la revisión de Vizum, igual que un pago creado en el panel. La wallet se debita al crearlo, salvo que sea diferido.
Cuerpo
| Campo | Descripción |
|---|---|
walletIdrequeridouuid | Wallet de la que sale el dinero. Tiene que ser de esta cuenta y de la moneda sourceCurrencyCode. |
beneficiaryIdrequeridouuid | A quién se le paga. |
sourceCurrencyCoderequeridostring | Moneda de la wallet, ISO 4217. |
sourceAmountstring | Lo que sale de la wallet. Manda éste o targetAmount, no los dos. |
targetAmountstring | Lo que le llega al beneficiario. Manda éste o sourceAmount, no los dos. |
targetCurrencyCodestring, opcional | Moneda en la que recibe el beneficiario. |
railstring, opcional | Riel del pago, hasta 20 caracteres. |
conceptstring, opcional | Concepto que ve el beneficiario, hasta 140 caracteres. En pagos nacionales por SPEI se valida un máximo de 20 caracteres al revisarlo. |
clientCommentstring, opcional | Nota interna para tu equipo, hasta 500 caracteres. |
paymentReasonstring, opcional | Código de motivo del pago, cuando el destino lo requiere. Los valores válidos vienen en las options del campo paymentReason de Requisitos por corredor. |
isPayLaterboolean, opcional | Pago diferido: se crea sin debitar la wallet y se fondea después con pay-now. Sólo si tu cuenta tiene plazo configurado. |
Respuesta 201
| Campo | Descripción |
|---|---|
iduuid | Identificador del pago. |
publicIdstring | null | Folio. null hasta que el pago se liquida. |
accountId, walletId, beneficiaryId | Los de la solicitud. |
statusstring | pending. Ver Estatus de un pago. |
sourceAmount, sourceCurrencyCode, targetAmount, targetCurrencyCode | Montos y monedas. El lado no anclado viene calculado cuando aplica; en un pago nacional en la misma moneda el destino va en null. |
conceptstring | null | Concepto. |
isPayLaterboolean | Si es diferido. |
expiresAtfecha | null | Hasta cuándo se puede fondear un pago diferido. |
createdAtfecha | Creación. |
curl -X POST https://open.vizum.mx/v1/accounts/$ACCOUNT_ID/transactions \
-H "X-Api-Key: $VIZUM_KEY" \
-H "Idempotency-Key: 3d5f7a91-0c2e-4b8d-a6f4-91e0c3b2d754" \
-H "Content-Type: application/json" \
-d '{
"walletId": "0196f2a1-8e44-7c02-b1f3-2a6d9e4c0f58",
"beneficiaryId": "01a2b3c4-0000-7000-8000-00000000b001",
"sourceCurrencyCode": "MXN",
"sourceAmount": "15000.00",
"concept": "Factura 1042"
}'{
"id": "01a2b3c4-0000-7000-8000-00000000a001",
"publicId": null,
"accountId": "0196f2a1-4c3e-7b10-9d2a-5e8f1c0a7b21",
"walletId": "0196f2a1-8e44-7c02-b1f3-2a6d9e4c0f58",
"beneficiaryId": "01a2b3c4-0000-7000-8000-00000000b001",
"status": "pending",
"sourceAmount": "15000.00",
"sourceCurrencyCode": "MXN",
"targetAmount": null,
"targetCurrencyCode": null,
"concept": "Factura 1042",
"isPayLater": false,
"expiresAt": null,
"createdAt": "2026-10-27T16:02:11.482Z"
}Fondear pago diferido
transactions:send · Requiere Idempotency-KeyDebita la wallet para un pago creado con isPayLater: true y lo deja en funded, esperando la revisión de Vizum. Tiene que hacerse antes de su expiresAt. Sin cuerpo.
Respuesta 200
El pago, con la misma forma que Crear pago.
curl -X POST https://open.vizum.mx/v1/accounts/$ACCOUNT_ID/transactions/$TRANSACTION_ID/pay-now \
-H "X-Api-Key: $VIZUM_KEY" \
-H "Idempotency-Key: 9a4c2e10-5f3b-4d7e-b1a8-6c0d2e9f4a31"Listar pagos
transactions:readLos pagos salientes de tus cuentas, del más reciente al más antiguo. Paginada.
Parámetros de consulta
| Parámetro | Descripción |
|---|---|
accountIduuid, opcional | Sólo los pagos de esa cuenta. |
statusstring, opcional | Sólo los pagos en ese estatus. |
page, limit | Ver Paginación. |
El objeto pago
| Campo | Descripción |
|---|---|
iduuid | Identificador del pago. |
accountIduuid | Cuenta que paga. |
publicIdstring | null | Folio, asignado al liquidarse. |
statusstring | Ver Estatus de un pago. |
typestring | money_out. |
payLaterboolean | Si es diferido. |
conceptstring | null | Concepto. |
sourceAmount, sourceCurrencystring | null | Lo que salió y en qué moneda. |
targetAmount, targetCurrencystring | null | Lo que llega y en qué moneda. null cuando no aplica, por ejemplo en un pago nacional en la misma moneda. |
railstring | null | Riel del pago. |
createdAtfecha | Creación. |
beneficiaryobjeto | null | El objeto beneficiario. |
curl "https://open.vizum.mx/v1/transactions?status=pending&limit=20" \
-H "X-Api-Key: $VIZUM_KEY"{
"data": [
{
"id": "01a2b3c4-0000-7000-8000-00000000a001",
"accountId": "0196f2a1-4c3e-7b10-9d2a-5e8f1c0a7b21",
"publicId": null,
"status": "pending",
"type": "money_out",
"payLater": false,
"concept": "Factura 1042",
"sourceAmount": "15000.00",
"sourceCurrency": "MXN",
"targetAmount": null,
"targetCurrency": null,
"rail": "SPEI",
"createdAt": "2026-10-27T16:02:11.482Z",
"beneficiary": { … }
}
],
"total": 1,
"page": 1,
"limit": 20,
"totalPages": 1
}Detalle de un pago
transactions:readUn pago con su desglose y su línea de tiempo. Es la ruta para seguir el estatus de un pago. Si el pago no existe o no es de tus cuentas, la respuesta es la misma: 404.
Respuesta
El objeto pago más:
| Campo | Descripción |
|---|---|
feestring | null | Comisión total cobrada, en la moneda de origen. null si no hay comisión registrada. |
ratestring | null | Tipo de cambio aplicado: una unidad de sourceCurrency en targetCurrency. |
eventslista | Línea de tiempo, de lo más antiguo a lo más reciente. Cada evento es { type, at }. |
Tipos de evento
| Tipo | Significado |
|---|---|
created | Se creó el pago. |
updated | Cambió el estatus o los datos del pago. |
approved | Vizum aprobó el pago. |
rejected | Vizum rechazó el pago. |
money_in | Se registró un movimiento de fondos del pago. |
pay_later.funded | Se fondeó un pago diferido. |
pay_later.extended | Se extendió el plazo de un pago diferido. |
pay_later.reactivated | Se reactivó un pago diferido. |
pay_later.cancelled | Se canceló un pago diferido. |
internal_transfer.completed | Se completó una transferencia entre wallets. |
curl https://open.vizum.mx/v1/transactions/$TRANSACTION_ID \
-H "X-Api-Key: $VIZUM_KEY"{
"id": "01a2b3c4-0000-7000-8000-00000000a002",
"accountId": "0196f2a1-4c3e-7b10-9d2a-5e8f1c0a7b21",
"publicId": "VZM-2026-000123",
"status": "filled",
"type": "money_out",
"payLater": false,
"concept": "Factura 88",
"sourceAmount": "19150.00",
"sourceCurrency": "MXN",
"targetAmount": "1000.00",
"targetCurrency": "USD",
"rail": "SWIFT",
"createdAt": "2026-10-27T16:10:03.120Z",
"beneficiary": { … },
"fee": "350.00",
"rate": "0.0522",
"events": [
{ "type": "created", "at": "2026-10-27T16:10:03.120Z" },
{ "type": "approved", "at": "2026-10-27T16:24:47.902Z" },
{ "type": "updated", "at": "2026-10-27T17:02:15.331Z" }
]
}¿Dudas con la integración? Escríbenos a soporte con el x-request-id de la llamada.

