Conversión de monto en la web
La moneda viene del catálogo PlatformData.Currency del backend: GET /v1/platforms publica currency y GET /me/usersbank devuelve currency resuelta para cada cuenta. El frontend no tiene un mapa de monedas por banco. El selector de Verificar pago inicia con esa moneda: VES para bolívares, USDT para Binance y USD para Zinli. VES se normaliza internamente como VEF. Si eliges otra moneda, el frontend obtiene las tasas de GET /exchange/rate y calcula monto × tasa_origen / tasa_destino, con tasas expresadas en bolívares por unidad. Redondea una sola vez a dos decimales y muestra “Se validarán” con el importe exacto.
El POST de verificación recibe únicamente ese monto calculado en amount, junto con los campos habituales. El backend no vuelve a convertirlo. Si ambas monedas coinciden, se conserva el monto introducido y no aparece el aviso de conversión. Sin una tasa válida se bloquea el envío; no se utilizan tasas de respaldo inventadas. Este selector pertenece a Verificar pago y no cambia el flujo de enlaces de pago.
Verificar Pagos vía API
Valida transferencias y pagos móviles de forma automática directamente contra las entidades bancarias.
Elimina los comprobantes falsos. La verificación consulta directamente los registros del banco en tiempo real.
Tus clientes y sistemas reciben confirmación en segundos, automatizando despachos y suscripciones.
Casi todos los bancos aceptan validación genérica con tan solo la referencia del pago.
Reglas de verificación por Banco y movement_type
- Todos los bancos permiten
GENERIC(por ahora): La gran mayoría de entidades (Banco de Venezuela Personas, Banco Provincial, Banesco, Binance, Sandbox/Test, etc.) aceptanmovement_type: "GENERIC", requiriendo únicamente el número de referencia (el monto es opcional en varios de ellos). - Banco de Venezuela (Jurídico / Empresas) y Banesco: Permiten tanto
GENERICcomoMOVIL_PAY. ConGENERICbuscan en los movimientos globales de la cuenta por referencia; conMOVIL_PAYrealizan una consulta puntual de Pago Móvil solicitando los datos del pagador (cédula, teléfono, etc.). - Banco Mercantil: Solo permite
MOVIL_PAY(no soportaGENERIC). Es obligatorio enviarmovement_type: "MOVIL_PAY"junto con los datos del pagador (cédula, teléfono, banco origen y monto).
Endpoint
Consulta si una transacción bancaria ha sido recibida y acreditada en tu cuenta registrada.
https://api.pabilo.app/userbankpayment/{userBankId}/betaserioAutenticación
Authorization: Bearer TU_API_KEY.Parámetros de la URL
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
| userBankId | string | Sí | ID de tu cuenta bancaria configurada en Pabilo donde se recibió el dinero. Ver cómo copiarlo desde el panel → |
Cuerpo de la Petición (JSON)
Consulta la referencia completa de campos dinámicos para ver el desglose detallado campo por campo.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
| bank_reference | string | Sí | Dígitos de la referencia bancaria emitida por el banco de origen. |
| movement_type | string | Sí | Tipo de validación a ejecutar: • "GENERIC": Soportado por la gran mayoría de bancos y cuentas (Venezuela Personas/Jurídico, Provincial, Banesco, Binance, Test). Recomendado por defecto.• "MOVIL_PAY": Obligatorio para Banco Mercantil (único método soportado). También soportado por Banco de Venezuela (Jurídico) y Banesco.• "TRANSFER": Transferencias bancarias tradicionales según compatibilidad del banco. |
| amount | number | Condicional | Monto de la transferencia. Opcional en Banco de Venezuela (Personas) y Provincial en modo GENERIC. Requerido en Banco Mercantil y demás cuentas. |
| dni_pagador | object | Condicional | Cédula o RIF del cliente pagador. Requerido para Banco Mercantil, y para Banco de Venezuela Jurídico y Banesco en modo MOVIL_PAY. Formato: { "dni_type": "V", "dni_number": "12345678" }. |
| phone_pagador | string | Condicional | Teléfono del cliente pagador afiliado a Pago Móvil (ej. "04141234567"). Requerido en Banco Mercantil, así como en Venezuela Jurídico y Banesco cuando se usa MOVIL_PAY. |
| bank_origin | string | Condicional | Código de 4 dígitos del banco emisor del cliente (ej. "0102"). Requerido en Banco Mercantil (MOVIL_PAY). |
| fecha_pago | string | Opcional | Fecha del pago en formato YYYY-MM-DD (ej. "2026-08-03"). Si no se envía, toma por defecto la fecha actual. |
Ejemplos de Código
cURL (Modo GENERIC - Casi todos los bancos, incluidos BDV y Banesco)
Ideal para Venezuela (Personas y Jurídico), Banesco, Provincial, Binance y Sandbox. Solo requiere la referencia bancaria (y monto opcional/según banco):
curl -X POST https://api.pabilo.app/userbankpayment/USER_BANK_ID/betaserio \
-H "Content-Type: application/json" \
-H "Authorization: Bearer TU_API_KEY" \
-d '{
"bank_reference": "67890",
"amount": 0,
"movement_type": "GENERIC",
"fecha_pago": "2026-08-03"
}'cURL (Modo MOVIL_PAY - Banco Mercantil, Venezuela Jurídico y Banesco)
Obligatorio para Banco Mercantil (no soporta GENERIC). Opcional para Banco de Venezuela Jurídico y Banesco cuando se desea validar puntualmente por Pago Móvil con datos del pagador:
curl -X POST https://api.pabilo.app/userbankpayment/USER_BANK_ID/betaserio \
-H "Content-Type: application/json" \
-H "Authorization: Bearer TU_API_KEY" \
-d '{
"bank_reference": "123456",
"amount": 100.00,
"movement_type": "MOVIL_PAY",
"dni_pagador": { "dni_type": "V", "dni_number": "12345678" },
"phone_pagador": "04141234567",
"bank_origin": "0102"
}'JavaScript (Fetch - Modo GENERIC)
const verifyPaymentGeneric = async () => {
const userBankId = "TU_USER_BANK_ID";
const response = await fetch(`https://api.pabilo.app/userbankpayment/${userBankId}/betaserio`, {
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer TU_API_KEY"
},
body: JSON.stringify({
bank_reference: "67890",
amount: 50.00,
movement_type: "GENERIC"
})
});
const data = await response.json();
console.log(data);
};JavaScript (Fetch - Modo MOVIL_PAY para Banco Mercantil, BDV Jurídico o Banesco)
const verifyPaymentMovilPay = async () => {
const userBankId = "TU_USER_BANK_ID";
const response = await fetch(`https://api.pabilo.app/userbankpayment/${userBankId}/betaserio`, {
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer TU_API_KEY"
},
body: JSON.stringify({
bank_reference: "123456",
amount: 100.00,
movement_type: "MOVIL_PAY", // Obligatorio en Mercantil; opcional en BDV Jurídico y Banesco
dni_pagador: {
dni_type: "V",
dni_number: "12345678"
},
phone_pagador: "04141234567",
bank_origin: "0102"
})
});
const data = await response.json();
console.log(data);
};Respuestas de la API
La respuesta indicará si el pago fue validado exitosamente y si es una transacción nueva o previamente registrada.
Respuesta Exitosa - Pago Nuevo (200 OK)
{
"user_bank_payment": {
"id": "ubp_68b1a2c3d4e5f6a7b8c9d0e1",
"bank_reference_id": "123456",
"amount": 100,
"user_bank_id": "685725c59e6febc736848bf5",
"status": "verified",
"created_at": "2026-08-03T14:58:07.081Z"
},
"payment_date": "2026-08-03",
"is_new": true,
"credit_cost": 1,
"user_credits_total": 99,
"user_credits_total_in_usd": 4.95
}Respuesta Exitosa - Pago Ya Validado Anteriormente (is_new: false)
Si la referencia ya había sido procesada en tu sistema, la API la devuelve con is_new: false y costo 0 créditos para evitar duplicaciones.
{
"data": {
"credit_cost": 0,
"is_new": false,
"user_bank_payment": {
"id": "6a70ac7f7e8da56b6db795bc",
"bank_reference_id": "123456",
"amount": 100,
"user_bank_id": "685725c59e6febc736848bf5",
"status": "paid",
"movement_type": "GENERIC"
},
"payment_date": "2026-08-03",
"user_credits_total": 99,
"user_credits_total_in_usd": 4.95
},
"message": "payment confirmed"
}Respuesta de Error - Pago No Encontrado (404)
{
"error": "PAYMENT_NOT_FOUND",
"message": "payment not found: movement not found with bank reference 67890, movements counts 0"
}Campos Clave de la Respuesta
- is_new (boolean): Indica si es la primera vez que se verifica este pago (
true) o si ya había sido verificado anteriormente (false). ¡Fundamental para evitar procesar la misma orden de compra dos veces! - user_bank_payment (object): Objeto con los detalles del movimiento registrado en el sistema.
- payment_date (string): Día del movimiento confirmado por el banco en formato
YYYY-MM-DD, en hora de Caracas. Es distinto deuser_bank_payment.created_at, que indica cuándo Pabilo registró o verificó el pago. - credit_cost (number): Cantidad de créditos debitados en esta consulta (las consultas duplicadas tienen costo 0).
- user_credits_total (number): Balance de créditos restante en tu cuenta.
Códigos de Estado HTTP
- 404 Not Found: El movimiento no existe en el banco. Revisa que el cliente haya realizado el pago a la cuenta correcta y que los dígitos de la referencia coincidan.
- 400 Bad Request: Faltan datos obligatorios para el banco seleccionado (por ejemplo, omitir
phone_pagadoro usarGENERICen Banco Mercantil). - 401 Unauthorized: API Key inválida, inactiva o ausente en los headers.
- 402 Payment Required: No cuentas con créditos suficientes para completar la validación bancaria.
Cobros, clientes y productos
Usa el mismo client_id para identificar al comprador, tenga o no credenciales B2B2B. Asócialo en Betaserio, enlaces y suscripciones para consultar lo cobrado por cliente y descargar reportes.
Ver parámetros, ejemplos y API de reportes JSON / CSV