Documentación completa

QuickPay para comercios e integradores

Todas las guías de docs.pagaconquickpay.com en una sola página. Versión del 17 de octubre de 2026.

Entender QuickPay

Qué es QuickPay y cómo llega el dinero

Con QuickPay cobras en bolívares a cualquier persona con cuenta en un banco venezolano. Tu cliente abre un enlace, elige su banco, escribe su teléfono y su cédula, y confirma con la clave de 8 dígitos que le envía su banco (por SMS, notificación o correo). No se registra ni instala nada.

Lo que pasaQuién lo hace
Creas el cobro (un enlace, un QR o un botón)Tú, desde el portal o desde tu sistema
Abre el enlace y paga con la clave de su bancoTu cliente
Confirma el pago con el bancoQuickPay
Te avisa (en el portal y, si integraste, por webhook)QuickPay
Te transfiere el dinero a tu cuentaQuickPay

Un pago ocurre en dos momentos

  1. El pago. El banco confirma el débito y el cobro queda pagado. Desde tu sistema te llega el webhook link.pagado.
  2. La acreditación. QuickPay te transfiere el monto, menos la comisión, a tu cuenta. Con la liquidación inmediata (activándose por etapas) te llega además el webhook link.acreditado con el desglose.

Entrega cuando el cobro esté pagado, no antes. Que el cliente vuelva a tu web o te mande una captura no prueba nada: la prueba es el estado pagado (webhook o consulta).

Dos formas de usarlo

¿No sabes cuál? → ¿Cuál solución necesito?

¿Cuál solución necesito?

Elegir mal no rompe nada, pero trabajas de más. Ubícate en la primera tabla que te describa.

Si no programas

Si…Usa…Dónde
Cobras un monto puntual a una personaUn cobro con monto (enlace + QR, o por WhatsApp)Cobrar
Quieres que te paguen el monto que ellos escribanTu página de pago /p/tu-usuarioPágina de pago
Cobras a muchos clientes a la vez (condominio, colegio, cartera)Cobranza masiva desde un ExcelClientes y cobranza
Cobras lo mismo cada mes, semana o añoSuscripcionesSuscripciones
Tienes una web y quieres un botón "Pagar"El botón de tu portal (copiar y pegar)Botón para tu web

Si programas

Si…Usa…Guía
Tu web, app o bot crea un cobro por pedidoUn enlace de pago por pedido + webhookEnlaces de pago
Generas cobros en bloque desde tu sistemaCobro por lote (hasta 500 por llamada)Cobro por lote
Tu bot de WhatsApp cobraEnlace en un mensaje con botón + webhookCobrar desde tu bot
Quieres pedir la clave del banco desde tu propia pantallaAPI directa (sólo aliados)API directa

Lo más simple casi siempre gana. Si dudas entre el portal y la API, empieza por el portal: puedes pasar a la API después sin cambiar nada de tu cuenta.

Cómo funciona un cobro

Todo en QuickPay es un cobro: un monto, un concepto y una fecha de vencimiento. Cada cobro tiene un enlace (https://pay.pagaconquickpay.com/l/…) donde tu cliente paga.

De principio a fin

  1. Creas el cobro. Desde el portal o con POST /switch/v1/links. Te devolvemos su id y su url.
  2. Se lo haces llegar. Por WhatsApp, correo, QR, un botón en tu web o tu bot.
  3. Tu cliente paga. Elige su banco, escribe su teléfono y su cédula, recibe la clave de 8 dígitos de su banco y la escribe.
  4. Se confirma con el banco. El cobro pasa a pagado. Un cobro se paga una sola vez: nadie puede pagarlo dos veces.
  5. Te enteras. En el portal (Transacciones y el aviso "Recibiste…") y, si integraste, con el webhook link.pagado.
  6. Te acreditamos. El monto, menos la comisión, a tu cuenta. Con la liquidación inmediata (activándose por etapas) llega también link.acreditado.

Lo que conviene saber

Siguiente: Estados de un cobro

Estados de un cobro

Un cobro siempre está en uno de estos estados. Los consultas con GET /switch/v1/links/:id (campo estado).

EstadoQué significa¿Entregas?
pendienteCreado, nadie lo ha pagadoNo
cobrandoUn cliente está pagando en este momentoTodavía no
procesandoEl banco recibió el débito y todavía no confirma que el dinero se movióTodavía no: espera
revisionLo estamos verificando con el bancoTodavía no: espera
pagadoEl banco confirmó el pago: el dinero es tuyoSí
expiradoVenció sin pagarseNo
canceladoLo cancelaste antes de que lo pagaranNo

Cómo se mueve

pendiente → cobrando → pagado
                    ↘ procesando / revision → pagado
pendiente → expirado | cancelado

Una regla: entrega sólo con pagado. Todo lo demás es "todavía no".

Comisión y liquidación

Cuánto cuesta

Cada pago recibido paga una comisión, que se descuenta del pago: tu cliente paga el monto exacto del cobro y a ti te llega el monto menos la comisión. Tu tarifa te la confirmamos al abrir tu cuenta.

Cuándo llega el dinero

La liquidación inmediata te transfiere el neto de cada pago apenas el banco lo confirma. La estamos activando por etapas: hoy se aplica a pagos pequeños mientras terminamos las pruebas con dinero real; te avisaremos cuando cubra todos tus cobros. Por cada pago liquidado te llega el webhook link.acreditado con el desglose:

CampoQué es
monto_brutoLo que pagó tu cliente
comisionLa comisión descontada
monto_acreditadoLo que llegó a tu cuenta
liquidacion_txn_idEl id de la transferencia

El neto irá a tu cuenta principal. Si registraste varias cuentas, al cobrar desde el portal puedes elegir en cuál cae cada cobro; por la API va siempre a la principal.

Las cuentas deben estar a tu nombre. A nombre de tu cédula si te registraste como persona, o del RIF de tu empresa si te registraste como negocio. Así lo verificamos con un pago de Bs 1 al registrarte.

Desde el portal

El portal de comercios

Todo lo que necesitas para cobrar, sin programar. Entras con tu usuario o correo y tu contraseña.

Cómo se abre la cuenta

  1. Eliges Para mí (con tu cédula) o Para mi negocio (con el RIF de tu empresa).
  2. Confirmas tu correo con un código.
  3. Subes la foto o el PDF de tu cédula o tu RIF: llenamos tus datos por ti y tú los confirmas.
  4. Si abres la cuenta para tu negocio, nos dices a qué se dedica: colegios y universidades, condominios, gimnasios y clubes, proveedores de internet, restaurantes y comida, sector salud, tiendas y emprendimientos, veterinarias y mascotas, u otro. Este paso no aparece en las cuentas para ti.
  5. Registras la cuenta donde quieres recibir el dinero. La verificamos enviándote Bs 1: así comprobamos que está a tu nombre.
  6. Creas tu usuario y tu contraseña.

Al terminar, tu cuenta queda aprobada para cobrar dinero real: la verificación con Bs 1 es la que la habilita. El equipo de QuickPay revisa cada alta después; si algo no cuadra, te escribimos.

De 11:45 p. m. a 1:30 a. m. (hora de Venezuela) los bancos hacen su mantenimiento diario: la verificación con Bs 1 espera a la 1:30 a. m. y no gastas intentos. En esa franja tampoco se pueden hacer pagos: tu portal, tu página de pago y tus enlaces lo avisan desde las 11:30 p. m. Puedes crear y enviar cobros a cualquier hora; tu cliente los paga a partir de la 1:30 a. m.

La cuenta debe estar a tu nombre. Si la cédula o el RIF no coinciden con el titular, el banco rechaza la verificación.

Qué haces en el portal

SecciónPara qué
InicioLo cobrado hoy y en el mes, lo que ya llegó a tu banco y tus últimos movimientos, en la divisa de tu panel
CobrarCrear un cobro con monto, tu página de pago o dividir una cuenta
TransaccionesTodos tus cobros: filtrar por fecha, estado y más, buscar, ver detalle, cancelar o reenviar uno pendiente, y descargarlos en Excel o CSV → Filtrar tus transacciones
ClientesTu base de clientes, a mano o desde Excel, con búsqueda y filtros, segmentos automáticos, etiquetas, estado de pago y acciones en grupo → Clientes y cobranza. En condominios se llama Propietarios e inquilinos
Cobranza masivaEnviar el cobro a muchos clientes, ahora o programado
SuscripcionesPlanes de cobro recurrente y sus suscriptores, en tres pestañas: Suscriptores, Planes y Métricas, con un resumen arriba (activas, al día, atrasadas, cobrado este mes) → Suscripciones. No aparece en restaurantes, que no tienen cobros recurrentes
ProductosTu catálogo: cobras eligiendo el producto (en restaurantes se llama Menú y productos; gimnasios, condominios y colegios no lo usan)
SucursalesRestaurantes, gimnasios, sector salud, veterinarias y tiendas: tus locales, para etiquetar cada cobro, elegir a qué cuenta caen sus pagos y filtrar Transacciones
PropinasRestaurantes: activar la pregunta de propina al pagar, sus botones y ver las propinas recibidas → Propinas
Urbanizaciones y complejosCondominios: cada urbanización o complejo con sus propietarios e inquilinos
IntegracionesBotón para tu web, llaves de API y webhooks
AjustesTus datos, tu plan, tus cuentas de cobro, tu equipo, la divisa del panel y tus avisos

Nombre comercial. Si tu negocio se conoce con un nombre distinto a su razón social (p. ej. razón social Inversiones Ejemplo 2023, C.A. y nombre comercial Pizzería Ejemplo), escríbelo al registrarte o en Ajustes › Tu cuenta (opcional, hasta 100 caracteres). Quien te paga ve ese nombre en la página de pago ("Estás pagando a…") y en el comprobante del pago. Tu razón social no cambia: es la que usan el banco y la verificación de tu cuenta. Si lo borras, vuelve a mostrarse la razón social.

El portal se adapta al tipo de negocio que elegiste al registrarte: el menú y los filtros cambian, pero los cobros, la cobranza masiva y las notificaciones funcionan igual para todos. Si elegiste "Otro", ves el menú estándar.

Cuando entra un pago, el portal te lo muestra al momento: "Recibiste US$ X (Bs Y) de Z", en la divisa de tu panel. Además te enviamos un correo por cada pago.

Cuentas personales

Si abriste la cuenta con Para mí, el portal es más corto, porque una persona recibe pagos pero no administra un negocio. El menú tiene cinco secciones:

SecciónPara qué
InicioLo cobrado hoy y en el mes, lo que ya llegó a tu banco y tus últimos movimientos
CobrarPedir un monto (enlace o QR para un pago puntual), Mi enlace (quien te paga escribe el monto) y Dividir una cuenta
MovimientosCada pago con su referencia del banco: filtrar, buscar, ver detalle y descargarlo. Es la misma pantalla que Transacciones en un negocio
ContactosLas personas que te han pagado y eligieron guardar sus datos, y las que agregas tú. Es la misma pantalla que Clientes en un negocio, sin carga masiva
AjustesTus datos, tu plan, tus cuentas de cobro, la divisa del panel y tus avisos

Una cuenta personal no tiene Cobranza masiva, Suscripciones, Productos, Sucursales, Integraciones ni Equipo: esas pantallas no aparecen, si abres su dirección vuelves a Inicio y las funciones equivalentes de la API responden 403. La página de pago de una persona muestra sus iniciales en lugar del ícono de tienda, y en ella quien te paga ve la casilla **"Guardar mis datos para pagarle más rápido a tu nombre." (sin nombre obligatorio). Quien la marca aparece en Contactos** cuando el pago queda confirmado; esa casilla no es permiso para enviarle novedades.

El estado de tu cuenta se dice igual en Inicio, Cobrar y Ajustes: cuenta de demostración (los pagos son simulados), en revisión (tus cobros son de prueba hasta que te aprobemos; pasa sólo si la aprobación automática no se pudo completar) o, cuando puedes cobrar, sin aviso. En Inicio, lo cobrado hoy y en el mes suma sólo pagos reales y debajo dice cuántos de prueba quedaron fuera; en una cuenta de demostración (todos sus pagos son simulados) los suma, para que se vea cómo luce un negocio cobrando.

Divisa del panel

En Ajustes › Divisa del panel eliges en qué moneda ves tus montos: dólares (US$), que es la que viene por omisión, euros (€) o bolívares (Bs). Sólo el Propietario y los Administradores la cambian; el Cobrador ve los montos en esa divisa.

Con dólares o euros, cada monto sale grande en esa divisa y, debajo y pequeño, lo que fue en bolívares; al lado sigue la cantidad de pagos. Aplica en Inicio (cobrado hoy, este mes, ya en tu banco y lo que está llegando), Últimos movimientos, Transacciones (la lista, el detalle y los totales de lo filtrado), Propinas, el total de cada lote de Cobranza masiva y el aviso de pago recibido. Los planes y productos siguen en la moneda en que fijaste su precio, y el monto que escribes al cobrar (Cobrar, Dividir cuenta, Nueva cobranza) arranca siempre en bolívares (puedes cambiarlo en cada cobro); al crear un producto o un plan, el precio arranca en tu divisa.

Con qué tasa se convierte. Cada pago usa la tasa BCV del día en que se pagó (día de Venezuela), no la de hoy:

Los totales suman cada pago ya convertido y se redondean al final; los bolívares de abajo son la suma real en bolívares. Es sólo cómo se muestra: los cobros y lo que llega a tu banco siguen siendo en bolívares.

Avisos por correo

Cada vez que te pagan, te llega un correo "Recibiste un pago" con el monto, el concepto, la fecha y un enlace a la transacción. Les llega al Propietario y a los Administradores, una sola vez por cobro. Viene encendido; lo apagas en Ajustes › Avisos.

Tu plan

En Ajustes › Tu plan ves tu plan, hasta cuándo está pagado, cuántos cobros por WhatsApp enviaste en los últimos 30 días y cuántos te quedan, y los planes disponibles con sus límites. Los cobros por correo no tienen límite. Esta sección la ven el Propietario y los Administradores.

PlanPrecioCobros por WhatsApp
GratisUS$ 020 al mes, hasta 5 por día uno a uno
EmprendedorUS$ 3 cada 30 días150 al mes, hasta 30 por día uno a uno
NegocioUS$ 12 cada 30 días600 al mes, hasta 100 por día uno a uno

Cambiar de plan: tocas Cambiar a …, ves el monto en US$ y su equivalente en bolívares a la tasa BCV de ese momento, y al continuar se abre el pago de QuickPay en otra pestaña. La tarjeta queda en Esperando tu pago… y, cuando el pago se confirma, el plan se activa solo y te llega un correo. Si el pago en línea no está disponible en ese momento, el botón abre el WhatsApp de QuickPay con el mensaje listo.

Filtrar tus transacciones

Arriba de la lista siempre ves tres controles: Fecha, Estado y Buscar. El botón Filtros abre el resto.

FiltroQué hace
FechaHoy, Ayer, Últimos 7 días, Este mes, Mes pasado o Rango personalizado (desde–hasta, ambos días incluidos). Los días son de Venezuela: un pago de las 9:00 p. m. entra en ese día. Un cobro cuenta en la fecha en que se pagó; si aún no se paga, en la que se creó
EstadoPagado (en tu banco), Pendiente, Procesando, En revisión, Vencido o Cancelado
BuscarPor concepto, nombre del cliente, referencia del pago o del crédito a tu cuenta, o el identificador del cobro (el final de su enlace)
SucursalEn los tipos de negocio con sucursales. En condominios, urbanización o complejo y propietario o inquilino; en colegios, grado y sección
Cuenta donde cae el dineroSólo si tienes más de una cuenta de cobro
MontoMínimo y máximo del cobro, en Bs
PropinaCon o sin propina (restaurantes)
Cómo se creóCreado en el portal, página de pago, botón de pago, WhatsApp, API, cobranza masiva o suscripción
Etiqueta del clienteSólo los cobros enviados a personas con esa etiqueta. El cobro del switch no trae al cliente, así que se cruza con lo que guardamos al enviarlo: Cobranza masiva, Suscripciones y quienes se registraron al pagar. Un cobro suelto (el de Cobrar, o un pago en tu página sin que la persona se registre) no tiene un cliente asociado y no aparece con este filtro
ModoCobros reales o de prueba
Pagos rechazadosCon rechazos: cobros con al menos un intento de pago rechazado. Sin rechazos: los que no tienen ninguno

Un rechazo no cambia el estado del cobro: vuelve a quedar Pendiente y tu cliente puede intentarlo de nuevo; si después paga, sale como pagado y el filtro lo sigue encontrando. Al abrir un cobro con intentos rechazados ves cuántos fueron (por ejemplo 2 intentos rechazados). Sólo cuentan los intentos en los que tu cliente llegó a escribir la clave de pago de su banco.

Los filtros activos aparecen como etiquetas que quitas con la x, y Limpiar filtros los quita todos. Quedan en la dirección de la página: puedes recargarla o compartirla y verás lo mismo. Debajo de los filtros ves cuántos cobros salieron, lo cobrado (suma de los pagados, sin contar los de prueba; en una cuenta de demostración, que sólo tiene pagos simulados, sí los cuenta) y, en restaurantes, las propinas, en la divisa de tu panel y con los bolívares al lado. La lista carga de 50 en 50 con Ver más.

Los filtros y los totales cuentan todos tus cobros, en cualquier divisa del panel. En dólares o euros, cada pago se convierte con la tasa BCV de su día de pago, y un cobro que creaste en esa misma divisa cuenta con su monto exacto. Los cobros de suscripción enviados antes del 9 de octubre de 2026 aparecen como cobranza masiva.

Descargar tus transacciones

En Transacciones › Descargar bajas en Excel o CSV exactamente lo que estás viendo, con los mismos filtros, y con las fechas en hora de Venezuela. Incluye hasta 5.000 cobros de lo filtrado (los más recientes); si hay más, la pantalla te avisa: acota las fechas para bajar el resto. Las columnas en bolívares (para tu contabilidad) se mantienen; si tu divisa es dólares o euros, se agregan al lado las columnas Monto, Propina y Acreditado en esa divisa, la Tasa BCV usada de cada pago y Tasa aproximada (Sí cuando no era la tasa exacta de ese día).

Cobrar: enlace, QR y WhatsApp

En Cobrar › Cobro con monto:

  1. Escribe el monto en bolívares (Bs), dólares (US$) o euros (€); el selector arranca en bolívares y puedes cambiarlo en cada cobro. En dólares o euros se convierte a bolívares a la tasa BCV del momento y debajo del monto ves la equivalencia (por ejemplo, «≈ Bs 9.806,15 a tasa BCV del 09/10»): tu cliente siempre paga en bolívares. El dólar usa la tasa BCV de QuickPay; el euro, la tasa oficial del euro, con máximo 36 horas de antigüedad. Si en ese momento no tenemos una tasa del euro confiable, la opción € aparece deshabilitada («Tasa del euro no disponible ahora») y no se puede cobrar en euros hasta que haya.
  2. Si quieres, agrega un concepto (lo ve tu cliente) o elige productos de tu catálogo.
  3. Elige cuándo vence: 1 hora, 24 horas, 3 días, 7 días o 30 días.
  4. Si tienes sucursales, elige la sucursal. Si tienes más de una cuenta, en ¿Dónde recibes este pago? ves la cuenta (banco y teléfono, con parte del número oculto): viene la de la sucursal, o la principal, y la puedes cambiar. Si la cambias, la recordamos para esa sucursal en ese navegador.
  5. Pulsa Crear cobro.

Te damos el enlace y su QR (puedes descargarlo para imprimirlo). Compártelo como quieras.

Por WhatsApp desde QuickPay

Con Cobrar por WhatsApp, le llega a tu cliente un mensaje de QuickPay con tu nombre, el monto y un botón Pagar que abre el pago dentro de WhatsApp, sin salir de la conversación.

Dividir una cuenta

En Cobrar › Dividir cuenta repartes un total entre varias personas: cada una recibe su propio cobro y en Transacciones los ves juntos. El total lo puedes poner en Bs, US$ o €, igual que en un cobro con monto: cada parte se convierte a bolívares a la tasa BCV del momento y ves lo que paga cada persona. Debajo del total aparece su equivalente en bolívares («Total ≈ Bs …») y, junto a cada persona, el de su parte.

Después

En Transacciones ves cada cobro con su estado y lo filtras por fecha, estado, monto y más (Filtrar tus transacciones). Mientras esté pendiente puedes reenviarlo o cancelarlo.

Tu página de pago

Es una dirección fija con tu usuario: https://portal.pagaconquickpay.com/p/tu-usuario. Quien la abre escribe el monto y te paga desde cualquier banco. Sirve para:

La encuentras en Inicio y en Cobrar › Tu página de pago, lista para copiar o compartir por WhatsApp.

Bs, US$ o €

Junto al monto, quien paga escoge en qué moneda lo escribe: Bs, US$ o €. Si no es Bs, debajo ve la equivalencia, por ejemplo "≈ Bs 1.250,00 a tasa BCV del 09/10". El pago siempre se debita en bolívares, a la tasa BCV del momento en que pulsa Continuar al pago; la conversión la hace QuickPay, no el navegador. Si no hay tasa disponible (sobre todo la del euro), esa moneda queda deshabilitada y, si se intenta igual, no se crea el cobro. Con el monto ya puesto en la dirección (abajo) el monto es en Bs y no se puede cambiar.

Con el monto ya puesto

Puedes agregar el monto y el concepto a la dirección para que el cliente sólo confirme:

https://portal.pagaconquickpay.com/p/tu-usuario?monto=150&concepto=Pedido%201024

Así funciona también el botón para tu web.

Un QR por sucursal o por cuenta

En Cobrar › Tu página de pago puedes elegir una sucursal y, si tienes más de una cuenta, la cuenta. La dirección y el QR cambian: los pagos que entren por ahí quedan en esa sucursal y caen en esa cuenta (o en la de la sucursal). Imprime un QR por local.

https://portal.pagaconquickpay.com/p/tu-usuario?sucursal=3

El enlace sigue funcionando aunque después archives esa sucursal o quites esa cuenta: lo que ya no exista se ignora y el pago cae en la cuenta que corresponda o, si no, en la principal.

Si activaste propinas, tu cliente puede agregar una antes de pagar.

Clientes y cobranza masiva

Tu base de clientes

En Clientes guardas a quién le cobras: nombre, WhatsApp o correo (al menos uno), cédula o RIF y una referencia (número de contrato, apartamento, socio).

También llegan solos: quien te paga con un enlace y marca **"Quiero ser cliente de tu comercio y recibir sus novedades" aparece aquí cuando el pago queda confirmado, con la etiqueta Se registró al pagar y Acepta novedades. Usa el filtro Aceptan novedades para ver sólo a quienes lo pidieron. En una cuenta en modo prueba, el filtro también muestra a quienes marcaron la casilla con un enlace de prueba, con la etiqueta Aceptó novedades (prueba)**: se ven para que pruebes el filtro, pero nunca reciben novedades. → Quiero ser cliente

En condominios esta sección se llama Propietarios e inquilinos: cada persona se guarda dentro de una urbanización o complejo, con su tipo (propietario o inquilino) y su unidad (apartamento o casa). En colegios puedes anotar el grado y sección; en restaurantes, gimnasios, salud, veterinarias y tiendas, la sucursal.

Buscar, filtrar y descargar

La lista de Clientes se carga de 50 en 50: al final pulsas Ver más, y el pie dice cuántos hay en total ("Mostrando 50 de 2.500"). Nada se queda fuera por ser muchos: el total es siempre el de lo que coincide con tu búsqueda y tus filtros.

Arriba tienes la búsqueda (por nombre, teléfono, correo, cédula o referencia), un selector de segmento, uno de etiqueta y el botón Filtros, que abre una ventana con el resto. Lo que filtras aparece como etiquetas que quitas con la x; Limpiar filtros las quita todas. Los filtros quedan en la dirección de la página: puedes recargarla o compartirla y verás lo mismo.

FiltroQué muestra
EtiquetasQuienes tengan cualquiera de las etiquetas que marques
Tiene suscripción / De qué planQuienes tienen una suscripción activa o pausada (en cualquier plan o en uno en particular), o ninguna. Las canceladas y las terminadas no cuentan
Estado de pagoAl día, pendiente o atrasado, según el último cobro que se le envió (cómo se calcula)
Fecha del último pagoUn rango de días de Venezuela, ambos incluidos
Total pagadoMínimo y máximo, en bolívares o en la divisa de tu panel. Quien nunca ha pagado cuenta como 0
Cómo llegóA mano, Carga masiva o Se registró al pagar. Lo que cargaste antes de que existiera esta distinción aparece como "A mano"
Aceptan novedadesSólo quienes lo pidieron al pagar
WhatsApp / CorreoCon o sin ese dato
Fecha de altaCuándo se agregó a tu lista (días de Venezuela, ambos incluidos)
Los de tu tipo de negocioUrbanización o complejo y propietario o inquilino (condominios), sucursal, grado y sección

Descargar baja en Excel (.xlsx) o CSV exactamente lo que estás viendo, con los mismos filtros: contacto, cédula, referencia, etiquetas, suscripciones activas, de dónde llegó, si acepta novedades, fecha de alta y, si tienes los pagos al día, su estado de pago, último pago, cantidad de pagos y total pagado en bolívares (y en tu divisa). Incluye hasta 20.000 clientes; si hay más, la pantalla te avisa para que afines el filtro.

Segmentos automáticos

Son listas que se arman solas, sin que etiquetes a nadie. Los eliges en el selector de segmento:

SegmentoQuiénes son
MorososSu último cobro enviado ya venció y no lo pagaron
Nuevos (30 días)Se agregaron en los últimos 30 días
Frecuentes3 pagos o más en los últimos 90 días
Aceptan novedadesMarcaron "quiero recibir novedades" al pagar
Sin pagar hace 60 díasLlevan más de 60 días en tu lista y no han pagado en ese tiempo (incluye a quien nunca pagó)

Etiquetas

Una etiqueta es una marca libre, con color, que le pones a tus clientes: VIP, moroso, referido, el grupo que quieras. Se crean en Clientes › Etiquetas (hasta 100, con nombre de hasta 40 letras y 8 colores; "VIP" y "vip" son la misma). Una persona puede tener varias.

El Cobrador ve las etiquetas de cada cliente y puede filtrar por ellas; crearlas, editarlas, borrarlas y ponerlas es del Propietario y del Administrador.

Acciones en grupo

Marca las casillas de la lista, o la casilla de arriba para elegir los de esa página; entonces aparece "Elegir los N que coinciden" para elegir a todos los que cumplen tu filtro, aunque no estén cargados en pantalla. Con ellos puedes:

El máximo es de 5.000 personas por acción. Si eliges más, no se hace una parte en silencio: te dice cuántas son y te pide afinar el filtro o hacerlo por partes. Sólo el Propietario y el Administrador eligen y administran; el Cobrador ve la lista pero no administra.

Estado de pago, último pago y total pagado

En la lista ves, de cada persona, su estado de pago, su último pago y lo que lleva pagado (en la divisa de tu panel, con los bolívares debajo; cada pago se convierte con la tasa BCV de su día de pago). Se calculan así:

Carga masiva desde Excel

Pulsa Carga masiva y sube un Excel (.xlsx) o un CSV de hasta 2.000 filas. Reconocemos estas columnas por su nombre:

ColumnaObligatoriaTambién se puede llamar
nombreSícliente, razón social, socio
whatsappUno de los dosteléfono, celular
correoUno de los dosemail
cedulaNodocumento, rif
referenciaNocontrato, apartamento, código
montoNodeuda, saldo, total
monedaNodivisa. Bs (o VES), US$ (USD, dólares) o € (EUR, euros); si falta, Bs
conceptoNodescripción, detalle

Pulsa Descargar plantilla para bajar un Excel con las columnas exactas de tu tipo de negocio y una fila de ejemplo. Según el negocio se agregan: tipo (propietario o inquilino) y complejo en condominios, que debe existir ya en Urbanizaciones y complejos; sucursal donde hay sucursales; grado en colegios.

Antes de guardar ves cada fila con su error, si lo tiene. Si vuelves a subir la planilla, los clientes que ya existen (mismo WhatsApp, correo o referencia) se actualizan, no se duplican.

Cobranza masiva

En Cobranza masiva le envías el cobro a muchos clientes de una vez:

La ventana Nueva cobranza tiene dos pasos. Paso 1, qué cobras: el monto (en Bs, US$ o €; en dólares o euros se convierte a bolívares a la tasa BCV del momento del envío), el concepto, cuándo sale y cuándo vence; en Más opciones van el nombre del envío, la sucursal y la cuenta. Paso 2, a quién: tus clientes, una etiqueta o el Excel, el canal y un resumen antes de enviar. Un envío a clientes admite hasta 5.000 personas; con más, te pide dividirlo en lugar de dejar a alguien fuera. El paso 1 debe estar completo para pasar al 2.

Eliges el canal (WhatsApp, correo o los dos), cuándo sale (ahora o en una fecha y hora) y cuándo vence. En el detalle de cada envío ves por dónde le llegó a cada cliente y quién ya pagó.

Puedes filtrar a quién enviar por urbanización o complejo y por propietario o inquilino (condominios), y asignar el envío a una sucursal. En Transacciones filtras luego por esos mismos datos.

Si tienes más de una cuenta, en ¿Dónde recibes estos pagos? eliges una para todo el envío. Si dejas Según la sucursal, cada cobro cae en la cuenta de la sucursal del envío (o de la sucursal de cada cliente) y, si no tiene, en la principal. Las suscripciones siguen la misma regla con la sucursal de cada suscriptor.

En la lista de cobranzas, el total de cada lote sale en la divisa de tu panel con los bolívares debajo (con «≈» cuando incluye precios en otra moneda o el lote aún no sale, porque se cobra a la tasa del envío).

WhatsApp usa el cupo de tu plan. Si se acaba y el cliente tiene correo, el cobro le llega por correo. El correo no tiene límite. Tu cupo y los planes están en Ajustes › Tu plan.

Suscripciones

Para lo que cobras siempre igual: el plan de internet, la mensualidad del gimnasio, la cuota del condominio.

Restaurantes: esta sección no está disponible en el portal de un restaurante, porque no tiene cobros recurrentes.

  1. Crea un plan: nombre, monto (en bolívares, dólares o euros; en dólares o euros, cada período se cobra en bolívares a la tasa BCV de ese día) y cada cuánto se cobra (semanal, quincenal, mensual, trimestral o anual).
  2. Agrega suscriptores desde tus clientes, eliges por dónde les llega (WhatsApp, correo o los dos) y la fecha del primer cobro.

En cada fecha, a partir de las 8:00 a. m. (hora de Venezuela), le enviamos el cobro a cada suscriptor y paga desde cualquier banco con la clave del suyo.

No es un débito automático. Nadie le debita a tu cliente sin que él lo apruebe: en cada período le llega el cobro y él lo paga.

Cuándo termina

Una suscripción puede terminar en una fecha o tras una cantidad de cobros (por ejemplo, mensual por 6 meses). En la lista ves "Termina el …". Después del último cobro queda Finalizada: no se genera ningún cobro más ni se envía ningún recordatorio. Para volver a cobrarle, agrégalo otra vez al plan.

Los suscriptores y los planes están en dos pestañas: Suscriptores y Planes.

Recordatorios

Cada plan trae Recordatorios encendidos (los apagas en la tarjeta del plan):

Llegan por correo a quien eligió recibir el cobro por correo. Si activas WhatsApp en el plan (viene apagado), también se reenvía el cobro pendiente por WhatsApp, y cada mensaje cuenta en tu cupo. En la lista de suscriptores ves el último recordatorio de cada uno.

Lo que puedes hacer

Si un cliente no paga un período, el siguiente le llega igual: los cobros no se acumulan en uno.

Resumen y métricas

Arriba de la pantalla ves cuatro tarjetas: Activas (con cuántas están pausadas y finalizadas), Al día, Atrasadas y Cobrado este mes, en la divisa de tu panel con los bolívares debajo. "Cobrado este mes" suma lo pagado en el mes (días de Venezuela) por cobros de suscripciones.

La pestaña Métricas agrega, para el mes en curso:

Estado de pago

Cada suscriptor tiene un estado de pago, según el último cobro que se le envió:

Los cobros anteriores que no pagó no se acumulan: si pagó el último, está al día. El estado sale de los pagos que confirma el banco y se actualiza solo, a los pocos minutos de cada pago.

Filtrar y trabajar en grupo

La lista de suscriptores se carga de 50 en 50 (Ver más) con el total exacto de lo filtrado. Filtras por estado (activas, pausadas, finalizadas), plan, estado de pago, etiqueta del cliente y con descuento, y buscas por nombre, teléfono, correo, referencia o plan. Los filtros quedan en la dirección de la página. Las etiquetas son las de Clientes: se ponen a la persona, no a la suscripción.

Marca las casillas, o elige todos los que coinciden con tu filtro, y puedes: pausar, reanudar, cambiar de plan, etiquetar o quitar una etiqueta. Cada acción dice cuántos se cambiaron y cuántos no (por ejemplo, a quien no estaba activa no se le puede pausar). Descargar baja en Excel o CSV lo que estás viendo, con su estado de pago y su descuento, hasta 20.000 filas.

Las suscripciones las administran el Propietario y el Administrador; el Cobrador no las ve.

Editar a un suscriptor

El lápiz de cada fila abre Editar suscriptor, con tres bloques que se guardan por separado:

Cada cambio queda en el historial del suscriptor.

Historial de cobros

El botón del reloj abre el historial de un suscriptor: cada cobro que se le generó, con su fecha, monto, estado (pagado, esperando pago, vencido, cancelado…), referencia del pago y código de verificación QP. Debajo, los cambios de su suscripción: pausas, cambios de plan y de descuento. El estado de cada cobro lo dice el switch; si no responde en ese momento, el estado se deduce de lo que ya sabemos y se marca como tal.

Agregar suscriptores a un plan

Agregar suscriptores abre una lista de tus clientes con búsqueda y de 50 en 50 (también puedes filtrar por etiqueta). Para el plan que elegiste:

Si cancelaste a alguien o terminó su plan, al agregarlo de nuevo se reactiva con la fecha y el fin nuevos.

Enlace para que se suscriban solos

Cada plan puede tener un enlace de suscripción (en la tarjeta del plan, pestaña Planes, interruptor Enlace para suscribirse solo). Lo copias y lo compartes por donde quieras. Quien lo abre:

  1. Elige su plan entre los que tienen el enlace encendido, y deja su nombre, su WhatsApp o correo (al menos uno) y, si quiere, su cédula o RIF.
  2. Paga el primer cobro desde su banco. Si el plan está en dólares o euros, se cobra en bolívares a la tasa BCV del día. El enlace de pago dura 24 horas.
  3. Queda suscrito sólo cuando el pago se confirma. Al volver del banco, la misma página espera la confirmación y se lo dice, con la fecha de su próximo cobro. Si no paga, no queda suscrito ni se crea nada. Si ya estaba en tus clientes (mismo WhatsApp o correo y sin una cédula distinta), se usa su ficha y no se duplica; si no, se crea y aparece como Se registró al pagar.

Enviar el formulario dos veces no crea dos cobros. El primer cobro cuenta como el primero del plan, y el siguiente le llega en la fecha que toca. Si el pago confirmado no cuadra con el cobro (otro monto), la suscripción no se activa por su cuenta. Un pago de prueba nunca suscribe a nadie en una cuenta que ya cobra de verdad.

Cambiar por un enlace nuevo deja de servir el anterior; apagar el interruptor deja el plan fuera del enlace.

Productos

Tu catálogo: lo que vendes con su precio, en bolívares, dólares o euros.

Un producto no se borra: se archiva, para que los cobros viejos lo sigan nombrando. Un cobro va en una sola moneda: no mezcla productos en monedas distintas. Al cobrar un producto en dólares o euros se convierte a bolívares a la tasa BCV del momento.

Importar el menú con IA (restaurantes)

En Menú y productos, Importar menú con IA lee una foto (JPG, PNG o HEIC), un PDF o un Excel o CSV de tu menú y arma la lista con nombre, descripción, precio y moneda. Antes de guardar revisas todo: corriges o descartas filas. Si un producto ya está en tu catálogo con el mismo nombre y precio, no se repite. Hasta 5 archivos de 9 MB.

Propinas

Para restaurantes y comida. Tu cliente puede agregar propina al pagar: se suma al pago y se debita en un solo débito, a la misma cuenta que el pago.

Activarlas

En el portal, ve a Propinas y enciende Pedir propina al pagar. Eliges:

Otro (tu cliente escribe el monto) y Sin propina siempre aparecen.

Qué ve tu cliente

Antes de elegir su banco ve ¿Quieres agregar propina? con tus botones (por ejemplo US$ 1 · Bs 36,50 o € 1 · Bs 39,80), Otro y Sin propina. Si elige una, el monto a pagar pasa a ser el del cobro más la propina, y su comprobante muestra las dos líneas: Monto y Propina.

Si en ese momento no tenemos la tasa BCV del dólar, los botones en dólares no aparecen; si no tenemos una tasa del euro confiable, los de euros tampoco. Los de bolívares, los de porcentaje, Otro y Sin propina siempre aparecen.

Qué recibes

La comisión de QuickPay se calcula sobre lo debitado (pago más propina) y, con liquidación inmediata, la propina te llega junto con el resto del pago.

Reglas

Botón para tu web

Un botón Pagar con QuickPay que pegas en cualquier página, sin programar.

  1. En el portal, ve a Integraciones › Configura tu botón.
  2. Elige el texto del botón y, si quieres, un monto fijo, un concepto, una sucursal y la cuenta donde caen sus pagos (si tienes más de una). Sin elegir, la de la sucursal o la principal.
  3. Copia el código y pégalo en tu web (WordPress, Wix, una tienda o HTML propio).

El botón lleva a tu página de pago con el monto y el concepto que elegiste. Si no fijas monto, tu cliente escribe cuánto paga.

¿Necesitas un monto distinto por pedido? Entonces crea un enlace por pedido desde tu sistema: → Enlaces de pago.

Botón en una sola línea: boton.js

Si ya tienes el enlace de cobro (el id que devuelve POST /links, o el slug de tu comercio), pega esto donde quieras que aparezca el botón:

html
<script src="https://pay.pagaconquickpay.com/boton.js" data-link="ID_O_SLUG"></script>

Cambia ID_O_SLUG por el id del enlace (por ejemplo 3f2c9a1e-5b7d-4e21-9c0a-8d4f6b1a2e37) o por el slug de tu comercio (por ejemplo mi-comercio). El botón Pagar con QuickPay aparece justo ahí y abre el pago en una pestaña nueva:

Atributos opcionales:

AtributoPara quéValores
data-textoCambiar el texto del botónTexto plano, hasta 40 caracteres. Por omisión, Pagar con QuickPay
data-abrirAbrir en una ventana emergente en vez de una pestañaventana. Si el navegador la bloquea, se abre la pestaña de siempre

Un botón por etiqueta <script>: para varios cobros en la misma página, pega una etiqueta por cada uno.

Qué garantiza.

Si tu sitio usa una política de seguridad de contenido (CSP), permite el script con script-src https://pay.pagaconquickpay.com. El botón no hace peticiones, así que no necesita connect-src, y sus estilos los aplica por código, sin style-src 'unsafe-inline'. El archivo se sirve con CORS abierto sólo para lectura (GET), porque es público y no usa credenciales.

Prueba primero con un enlace de prueba. Crea el enlace con tu llave sk_test_… y usa su id en data-link: pagas sin dinero real. → Modo prueba

Equipo y cuentas

Tus cuentas de cobro

En Ajustes › Dónde recibes tu dinero registras una o varias cuentas, todas a tu nombre (tu cédula o el RIF de tu empresa). Cada una se verifica con un pago de Bs 1. Una es la principal; al crear un cobro puedes elegir otra.

Una cuenta por sucursal

Si tienes sucursales, en Sucursales editas cada una y eliges Cuenta donde caen sus pagos (sólo el Propietario). Una sucursal sin cuenta usa la principal.

A qué cuenta cae un pago, en este orden:

  1. La que elijas en ese cobro (en Cobrar, Cobranza masiva, el botón web o el enlace de tu página).
  2. La de la sucursal del cobro.
  3. La principal.

Si la cuenta de una sucursal se quita, el pago cae en la principal. Todas tienen que estar a tu nombre: QuickPay lo vuelve a revisar en cada cobro.

Tu equipo

En Ajustes › Equipo invitas personas por correo. Les llega un enlace para crear su contraseña y entran con su correo.

RolPuede
PropietarioTodo, incluido el equipo y las cuentas de cobro
AdministradorTodo menos el equipo y las cuentas de cobro
CobradorCobrar y ver transacciones, clientes y productos

Sólo el Propietario invita y cambia roles. Si desactivas a alguien o le cambias el rol, su sesión se cierra en su siguiente acción; con el rol nuevo vuelve a entrar. Cambiar la contraseña también cierra sus sesiones abiertas.

Desde tu sistema

Cómo se integra

Integrar QuickPay son dos decisiones.

1. ¿Dónde paga tu cliente?

OpciónCómoPara
En la página de pago de QuickPay (recomendado)Creas un enlace y llevas al cliente a su urlWebs, apps, bots, correos: casi todo
En tu propia pantallaPides tú la clave del banco con la API directaSólo aliados con contrato → API directa

Con la página de QuickPay no manejas datos bancarios ni la clave del banco: sólo un id y una url.

2. ¿Cómo te enteras del pago?

OpciónCómoCuándo
Webhook (recomendado)Te enviamos link.pagado a tu servidor, firmadoSiempre que puedas recibir un POST
ConsultaGET /switch/v1/links/:id hasta ver pagadoComo respaldo, o si no puedes recibir webhooks

El camino completo

Tu servidor ──POST /links──▶ QuickPay      (te devuelve id y url)
Tu cliente  ──abre la url──▶ página de pago (paga con la clave de su banco)
QuickPay    ──link.pagado──▶ tu servidor    (entregas el pedido)

La llave va sólo en tu servidor. Nunca en el navegador, en una app móvil ni en un bot del lado del cliente: con ella cualquiera crearía cobros a tu nombre.

Empieza aquí: Tu primer cobro en 5 minutos

Tu primer cobro en 5 minutos

Cuatro pasos con tu llave de prueba: no se mueve dinero real.

1. Saca tu llave de prueba

En tu portal ve a Integraciones › Llaves de API › Crear llave, elige Prueba y copia el valor. Tiene esta forma:

tu-comercio:sk_test_…

Guárdala en una variable:

bash
export QP_KEY="tu-comercio:sk_test_…"

2. Crea un enlace de pago

bash
curl -s https://pay.pagaconquickpay.com/switch/v1/links \
  -H "x-switch-key: $QP_KEY" \
  -H "content-type: application/json" \
  -d '{ "monto": 150, "concepto": "Pedido #1024", "metadata": { "pedido": "1024" } }'

Te devuelve, entre otros campos:

json
{
  "id": "3f6c2a9e-8b1d-4c7a-9e2f-5a1b7c3d9e40",
  "url": "https://pay.pagaconquickpay.com/l/3f6c2a9e-8b1d-4c7a-9e2f-5a1b7c3d9e40",
  "estado": "pendiente",
  "mode": "test"
}

3. Págalo

Abre la url. Como es un cobro de prueba, la página te lo indica y acepta cualquier clave de 8 dígitos (para forzar un rechazo o un pago en proceso: Modo prueba): elige un banco, escribe un teléfono y una cédula de ejemplo (04141234567, V12345678) y paga.

4. Confirma que está pagado

bash
curl -s https://pay.pagaconquickpay.com/switch/v1/links/3f6c2a9e-8b1d-4c7a-9e2f-5a1b7c3d9e40 \
  -H "x-switch-key: $QP_KEY"

"estado": "pagado". Listo: ese es el ciclo completo.

Y ahora, el porqué

Llaves y entornos

Toda llamada lleva la cabecera:

x-switch-key: <tu-comercio>:<llave>

Dos tipos de llave

LlaveEmpieza conQué hace
Pruebask_test_Simula todo de punta a punta. Nunca mueve dinero
Producciónsk_live_Cobra de verdad

El modo lo decide la llave, no tu código. No hay ningún campo test=true: la misma petición con sk_test_ es de prueba y con sk_live_ es real. Un cobro creado en prueba queda de prueba para siempre, aunque lo abra alguien de verdad.

Cada llave sólo ve y toca lo de su modo. Con sk_test_ no se consulta, lista, edita ni cancela nada creado con sk_live_ (enlaces, lotes, órdenes, suscripciones, productos, propinas y equipo): responde 404 como si no existiera. Y una idempotency_key usada en prueba no se cruza con producción.

Hay dos cosas del comercio que no tienen modo y por eso exigen sk_live_: los webhooks (POST, PATCH y DELETE /switch/v1/webhooks, porque reciben también los avisos de producción) y la configuración de tus Flows de WhatsApp (POST /switch/v1/flow/config, PUT /switch/v1/flows/definicion). Con sk_test_ responden 403 con { "error": "requiere_llave_live" }; listar y ver webhooks sí funciona con cualquier llave. Si aún no tienes llave de producción, registra tu URL desde el portal (Integraciones › Webhooks).

Dónde se sacan

En tu portal, Integraciones › Llaves de API:

Dónde se guardan

Sólo en tu servidor, en una variable de entorno o un gestor de secretos. Nunca en el código del navegador, en una app móvil ni en un repositorio.

URL base

URL
APIhttps://pay.pagaconquickpay.com/switch/v1
Página de pagohttps://pay.pagaconquickpay.com/l/<id>

Es la misma para prueba y producción: cambia sólo la llave.

Enlaces de pago

Un enlace de pago es un cobro con su propia dirección (https://pay.pagaconquickpay.com/l/…). Tu cliente lo abre, elige su banco y autoriza con la clave de 8 dígitos que le manda su banco (por SMS, notificación o correo). La página la aloja QuickPay: tú no manejas datos bancarios.

Sirve para cobrar por WhatsApp, correo, SMS o QR: creas el enlace, lo envías y te enteras cuando lo pagan.

1. Crear un enlace

http
POST https://pay.pagaconquickpay.com/switch/v1/links
x-switch-key: tu-comercio:sk_test_…
Content-Type: application/json

{
  "monto": 450.00,
  "concepto": "Servicio de consultoría",
  "expira_horas": 72,
  "success_url": "https://tu-dominio.com/gracias?pedido=100",
  "metadata": { "cliente_id": "CLI-001", "factura": "FAC-2026-100" },
  "idempotency_key": "factura-FAC-2026-100"
}

Respuesta 201:

json
{
  "id": "3f6c2a9e-8b1d-4c7a-9e2f-5a1b7c3d9e40",
  "url": "https://pay.pagaconquickpay.com/l/3f6c2a9e-8b1d-4c7a-9e2f-5a1b7c3d9e40",
  "wa_deeplink": null,
  "qr_png": null,
  "monto": 450,
  "moneda": "VES",
  "concepto": "Servicio de consultoría",
  "estado": "pendiente",
  "expires_at": "2026-10-11T14:00:00.000Z",
  "success_url": "https://tu-dominio.com/gracias?pedido=100",
  "failure_url": null,
  "metadata": { "cliente_id": "CLI-001", "factura": "FAC-2026-100" },
  "mode": "test"
}

Guarda el id junto a tu pedido: con él consultas el cobro y reconoces su webhook. Para mandarle el cobro a tu cliente usa url.

Campos que puedes enviar

CampoTipoObligatorioNotas
montonúmeroSíMayor que cero, en bolívares.
conceptotextoSíLo que ve tu cliente al pagar. Hasta 140 caracteres.
monedatextoNoVES (la única hoy).
expira_horasnúmero enteroNoDe 1 a 720 (30 días). Por omisión, 24.
expira_enfecha ISO 8601NoVencimiento exacto; si lo envías, manda sobre expira_horas. Tiene que ser futuro.
success_urltextoNoA dónde vuelve tu cliente al pagar. Empieza con https://, hasta 400 caracteres. → Volver a tu web
failure_urltextoNoA dónde vuelve tu cliente si el pago no puede continuar. Empieza con https://, hasta 400 caracteres. → Volver a tu web
metadataobjetoNoTus datos: hasta 20 claves (nombre ≤ 40, valor ≤ 200 caracteres). Te los devuelve la respuesta de crear; no viajan en el webhook, así que guarda la relación id ↔ pedido en tu sistema.
idempotency_keytextoNoHasta 64 caracteres. Ver abajo.

Si el banco rechaza, tu cliente no sale de la página de pago: puede intentarlo otra vez con una clave nueva. Sólo vuelve a tu failure_url si el cobro ya no se puede pagar (venció o lo cancelaste) o si él elige Cancelar y volver.

2. No duplicar cobros: idempotency_key

Va en el cuerpo de la petición. Si repites la creación con la misma idempotency_key (por ejemplo, porque se cortó la red y no sabes si llegó), recibes el mismo enlace en vez de uno nuevo:

La llave vale dentro del modo: la misma idempotency_key con tu llave de prueba y con la de producción son dos enlaces distintos (uno test y otro live); nunca recibes con sk_live_ un enlace creado con sk_test_. Si recibes 409 con "error": "idempotency_key_en_uso", esa llave ya la usaste en el otro modo: usa otra.

Usa algo que identifique tu pedido (factura-FAC-2026-100), no un valor al azar por intento.

3. Compartir el enlace

Mándale url a tu cliente. En WhatsApp, lo mejor es un mensaje con botón (cta_url en la API de WhatsApp Cloud): abre la página de pago con un toque.

json
{
  "messaging_product": "whatsapp",
  "to": "584141234567",
  "type": "interactive",
  "interactive": {
    "type": "cta_url",
    "body": { "text": "Tienes un pago de Bs 450 pendiente. Puedes pagarlo desde cualquier banco." },
    "action": {
      "name": "cta_url",
      "parameters": { "display_text": "Pagar ahora", "url": "https://pay.pagaconquickpay.com/l/3f6c2a9e-8b1d-4c7a-9e2f-5a1b7c3d9e40" }
    }
  }
}

El mensaje sale de tu número de WhatsApp, y su costo en Meta es tuyo.

4. Lo que hace tu cliente

  1. Abre el enlace. Ve tu nombre, el concepto y el monto.
  2. Elige su banco y escribe el teléfono y la cédula afiliados a ese banco. Si quiere, escribe su nombre.
  3. Escribe la clave de 8 dígitos que le manda su banco.
  4. Mientras el banco confirma, la página muestra Procesando tu pago y no deja reenviar el pago. Si tu cliente intenta salir o recargar, el navegador le pregunta antes; si recarga igual, vuelve a esa misma pantalla, no al formulario. Si el banco tarda más de lo normal (90 segundos), se lo dice sin invitarlo a pagar de nuevo, y la página se actualiza sola cuando el banco responde.
  5. Ve la confirmación. Si enviaste success_url, vuelve a tu web.

Un enlace se paga una sola vez. Sólo tras un rechazo del banco puede intentarlo otra vez, con una clave nueva.

Cierre diario de los bancos

Todas las noches, de 11:45 p. m. a 1:30 a. m. (hora de Venezuela), los bancos hacen su cierre diario y no atienden pagos. En esa franja la página de pago:

Si alguien pide la clave dentro de la franja, la página recibe 503 con { "error": "cierre_bancario", "motivo": "Los bancos están en su mantenimiento diario y no se pueden hacer pagos. Podrás pagar a partir de la 1:30 a. m. (hora de Venezuela).", "reintentar_en": 5400 } (reintentar_en, en segundos, y la cabecera Retry-After dicen cuánto falta para que termine) y muestra el mismo aviso.

Lo que ya estaba en curso no se corta: un pago con la clave ya pedida sigue su camino y los avisos link.pagado y link.acreditado llegan como siempre. El enlace sigue pendiente y tu cliente lo paga después de la 1:30 a. m. con el mismo enlace, si no vence antes. Los enlaces de prueba no tienen esta franja: no pasan por el banco.

Pagar con tarjeta (piloto)

Está en piloto y apagado: QuickPay lo enciende por comercio. Si no está activo para tu cuenta, tu página de pago se ve exactamente como arriba.

Con el piloto activo, debajo de los bancos tu cliente ve Paga con tarjeta de débito o crédito: se aceptan tarjetas de crédito y las tarjetas de débito de Banco de Venezuela, Bancaribe, Bancrecer, Banco del Tesoro, Bancamiga, Banco Digital de los Trabajadores, BANFANB, Banco Fondo Común, Banco Plaza y R4. Antes del botón Pagar con tarjeta ve cuánto pagará: «Con tarjeta pagas Bs 103,00 (incluye recargo de 3 % por pago con tarjeta)» para un cobro de Bs 100. Al tocarlo pasa a la página de pago de Credicard, que es donde escribe su tarjeta: QuickPay no ve ni guarda los datos de la tarjeta. Ese formulario dura 6 minutos.

Quiero ser cliente

Debajo de la cédula, tu cliente ve el campo Tu nombre (opcional) y la casilla **"Quiero ser cliente de tu comercio y recibir sus novedades." La casilla viene desmarcada**: sólo la marca quien quiere. Si la marca, el nombre es obligatorio.

Cuando el cobro queda pagado (no antes), esa persona aparece en Clientes del portal con la etiqueta Se registró al pagar y Acepta novedades. Si ya la tenías (misma cédula, o mismo WhatsApp sin cédula), no se duplica ni se le cambia el nombre que le pusiste: sólo se marca que acepta novedades. En Clientes puedes filtrar por Aceptan novedades.

Si quien paga ya está registrado en QuickPay por WhatsApp con esa cédula, se usa el nombre de su registro: no tiene que registrarse dos veces.

Si quien cobra es una cuenta personal, la casilla dice **"Guardar mis datos para pagarle más rápido a su nombre."** y marcarla no vuelve obligatorio el nombre; sin nombre, el contacto se guarda con el teléfono de quien pagó. Esa casilla no es permiso para enviarle novedades.

Con un enlace de prueba se ve igual, pero el cliente queda marcado Se registró al pagar (prueba) y no cuenta como permiso para enviarle novedades.

Por la API sólo te llega si lo pidió: pagador.alta_cliente al consultar el enlace y en el aviso link.pagado. Nunca su cédula, teléfono ni nombre.

5. Enterarte del pago

bash
curl -s https://pay.pagaconquickpay.com/switch/v1/links/3f6c2a9e-8b1d-4c7a-9e2f-5a1b7c3d9e40 \
  -H "x-switch-key: $QP_KEY"
json
{
  "id": "3f6c2a9e-8b1d-4c7a-9e2f-5a1b7c3d9e40",
  "url": "https://pay.pagaconquickpay.com/l/3f6c2a9e-8b1d-4c7a-9e2f-5a1b7c3d9e40",
  "wa_deeplink": null,
  "qr_png": null,
  "comercio": "tu-comercio",
  "monto": 450,
  "moneda": "VES",
  "concepto": "Servicio de consultoría",
  "estado": "pagado",
  "expires_at": "2026-10-11T14:00:00.000Z",
  "txn_id": "b639fac6-1d2e-4f00-9a1b-3c4d5e6f7a8b",
  "created_at": "2026-10-08T14:00:00.000Z",
  "paid_at": "2026-10-08T14:03:22.000Z",
  "propina": 0,
  "total": 450,
  "pagador": { "alta_cliente": false },
  "codigo_verificacion": "QP-7K3M9-XQ4TA"
}

pagador.alta_cliente es true si quien pagó marcó "Quiero ser cliente de tu comercio y recibir sus novedades" en la página de pago. → Página de pago

propina y total vienen siempre: si activaste propinas y tu cliente agregó una, total = monto + propina es lo que se le debitó. monto no cambia.

Cuando el enlace está pagado, la respuesta trae codigo_verificacion: el mismo código que ve tu cliente en su comprobante. Cualquiera puede verificarlo.

Sólo consultas los enlaces del modo de tu llave: un enlace real consultado con sk_test_ (o uno de prueba con sk_live_) responde 404.

Qué significa cada estado: → Estados de un cobro

6. Listar tus enlaces

bash
curl -s "https://pay.pagaconquickpay.com/switch/v1/links?estado=pagado&limit=20" \
  -H "x-switch-key: $QP_KEY"

Devuelve una lista de enlaces (cada uno con la forma de la consulta, incluido codigo_verificacion si está pagado), del más nuevo al más viejo.

Los filtros se combinan entre sí (todos tienen que cumplirse). Por ejemplo, los pagados o en proceso del 8 de octubre en Venezuela que digan "mensualidad":

bash
curl -s "https://pay.pagaconquickpay.com/switch/v1/links?estado=pagado,procesando&desde=2026-10-08T04:00:00Z&hasta=2026-10-09T04:00:00Z&q=mensualidad" \
  -H "x-switch-key: $QP_KEY"
ParámetroNotas
estadoOpcional. Uno o varios separados por coma: pendiente, cobrando, procesando, revision, pagado, expirado, cancelado. Un valor que no es un estado se ignora.
desde · hastaOpcionales. Fecha ISO 8601 (2026-10-08T04:00:00Z) o milisegundos desde 1970. Se compara con la fecha del pago o, si aún no se pagó, con la de creación. desde entra y hasta no. Un día de Venezuela va de las 04:00 Z de ese día a las 04:00 Z del siguiente.
qOpcional. Texto a buscar en el concepto, el nombre de quien pagó, la referencia bancaria del pago, el id del enlace o su codigo_verificacion. Con varias palabras, cada una tiene que aparecer en alguno de esos campos. No distingue mayúsculas ni tildes.
min · maxOpcionales. Monto del enlace en Bs (sin propina), ambos incluidos.
con_propinaOpcional. true: sólo los que tienen propina. false: sólo los que no.
modeOpcional. test o live. Sólo ves los enlaces del modo de tu llave: con sk_test_, los de prueba; con sk_live_, los reales. Si pides el otro modo, la lista viene vacía.
origenOpcional. Cómo se creó: api, panel, mi_pagina, boton o whatsapp.
limitCuántos traer. Por omisión 50, máximo 200.
offsetCuántos saltar, para paginar.

Si desde, hasta, min, max, con_propina, mode u origen traen un valor que no se entiende, responde 400 con { "error": "validation", "parametro": "…", "detail": "…" } en lugar de ignorarlo.

7. Cancelar un enlace

Si el pedido ya no va (el cliente se arrepintió, te equivocaste en el monto), cancela el enlace:

bash
curl -s -X POST https://pay.pagaconquickpay.com/switch/v1/links/3f6c2a9e-8b1d-4c7a-9e2f-5a1b7c3d9e40/cancelar \
  -H "x-switch-key: $QP_KEY"
json
{ "id": "3f6c2a9e-8b1d-4c7a-9e2f-5a1b7c3d9e40", "estado": "cancelado" }

Sólo se puede cancelar un enlace pendiente. Si tu cliente ya está pagando (cobrando, procesando, revision) o ya pagó, responde 409 con { "error": "no_cancelable", "estado": "…" } y no se toca nada: cancelar a mitad de un pago dejaría el dinero sin dueño. Si el id no es tuyo, no existe o es del otro modo (un enlace real con tu llave de prueba, o al revés), 404. Cuando alguien abre un enlace cancelado ve que fue cancelado (y, si pusiste failure_url, vuelve a tu web).

8. Muchos cobros de una vez

Si le cobras a una lista de personas (mensualidades, cuotas), crea hasta 500 enlaces en una sola petición: → Cobro por lote

Verificar un comprobante

El comprobante de un pago exitoso lleva un código de verificación (por ejemplo QP-7K3M9-XQ4TA) y la línea "Verifícalo en pagaconquickpay.com/verificar". Con ese código, tú o cualquier persona pueden comprobar que el comprobante es auténtico. Una captura con el monto editado no pasa la verificación, porque el código depende del monto, la moneda y la fecha del pago.

bash
curl -s "https://pay.pagaconquickpay.com/switch/v1/verificar/QP-7K3M9-XQ4TA"
json
{
  "valido": true,
  "estado": "válido",
  "monto": 150,
  "moneda": "VES",
  "comercio": "Tu Comercio",
  "fecha_hora": "2026-10-09T18:03:22.000Z",
  "fecha_hora_caracas": "09/10/2026, 02:03 p. m.",
  "referencia_bancaria": "****2808",
  "prueba": false,
  "mensaje": "Comprobante auténtico emitido por QuickPay.",
  "concepto": "Mensualidad de octubre",
  "referencia_externa": null,
  "verificaciones": 1,
  "primera_verificacion": "2026-10-09T18:05:10.000Z",
  "primera_verificacion_caracas": "09/10/2026, 02:05 p. m."
}

Cobro por lote — botón de pago para tu bot de WhatsApp

Sirve para cobrarle a una lista de personas (una mensualidad, una cuota, una factura por cliente) desde el bot que ya tienes, sin construir integración bancaria. Tú mandas la lista, QuickPay te devuelve un link de pago por persona, tu bot envía cada link con un botón, y tú te enteras de cada pago por webhook o consultando el lote.

Funciona con cualquier plataforma que pueda hacer una petición HTTP y mandar un mensaje con botón de URL (software propio, n8n, Make, ManyChat, Wati, Landbot, Builderbot, Take Blip).

1. Crea el lote

http
POST https://pay.pagaconquickpay.com/switch/v1/lotes
x-switch-key: <tu API key>
Content-Type: application/json

{
  "nombre": "Mensualidad septiembre",
  "idempotency_key": "mensualidad-2026-09",
  "expira_horas": 72,
  "items": [
    { "monto": 450.00, "concepto": "Mensualidad septiembre", "referencia_externa": "CLI-001",
      "cliente": { "nombre": "Cliente Uno", "telefono": "04141234567" } },
    { "monto": 450.00, "concepto": "Mensualidad septiembre", "referencia_externa": "CLI-002",
      "cliente": { "nombre": "Cliente Dos", "telefono": "04241234567" } }
  ]
}

Respuesta 201: el lote con un item por persona. Lo que necesitas de cada item es url (para el botón) y link_id (para reconciliar):

json
{
  "id": "…", "total": 2, "mode": "test",
  "resumen": { "total": 2, "pagados": 0, "abiertos": 2, "monto_total": 900, "monto_pagado": 0, "completo": false },
  "items": [
    { "n": 1, "link_id": "…", "url": "https://pay.pagaconquickpay.com/l/…", "wa_deeplink": null,
      "referencia_externa": "CLI-001", "monto": 450, "estado": "pendiente" }
  ]
}

Reglas:

2. Manda el botón desde tu bot

Envía a cada persona un mensaje con botón de URL (cta_url en la API de WhatsApp Cloud, o el bloque "botón con enlace" de tu plataforma) apuntando a la url del item. El botón abre el checkout dentro de WhatsApp; un enlace pegado como texto no siempre lo hace.

El checkout le pide a la persona su banco, teléfono o cuenta, cédula y el código OTP que le manda su banco. QuickPay cobra por débito inmediato. Cada link se paga exactamente una vez.

El mensaje sale desde tu número, así que su costo en Meta es tuyo.

Si tu bot manda el cobro fuera de las 24 horas desde el último mensaje del cliente, WhatsApp exige una plantilla aprobada (categoría utility). Ejemplo de plantilla que puedes registrar en tu WABA y ajustar a tu tono (el botón es de tipo URL con sufijo dinámico, que rellenas con el link_id del item):

Hola {{1}}, tienes un pago pendiente de {{2}} por {{3}}.
Puedes pagarlo con débito inmediato desde tu banco, en un minuto.
[Botón URL]  Pagar ahora  →  https://pay.pagaconquickpay.com/l/{{1}}

Variables del cuerpo: {{1}} nombre del cliente, {{2}} concepto, {{3}} monto con "Bs". Variable del botón: el link_id. Dentro de las 24 horas puedes mandar un mensaje interactivo cta_url sin plantilla.

3. Entérate de los pagos

Dos formas, y puedes usar las dos:

Un pagado es un pago confirmado por el banco. procesando y revision son estados intermedios: no los trates como pagados ni como fallidos; espera el webhook o vuelve a consultar.

4. Cancela lo que no se cobró

POST /switch/v1/lotes/{id}/cancelar cancela sólo los items que siguen pendiente. Un item que está en cobrando, procesando o revision no se cancela porque puede haber un OTP o un débito en curso; espera a que termine.

Prueba sin dinero real

  1. En tu portal, Integraciones › Llaves de API, crea una llave de prueba.
  2. Crea un lote con 2 items y manda los links a tu propio teléfono.
  3. Abre uno, completa el checkout: en modo test el banco se simula y el item pasa a pagado.
  4. Consulta el lote y verifica que el webhook llegó.

Referencia completa de la API: Referencia de la API y la colección Postman.

Pago dividido

En piloto. El pago dividido está detrás de una bandera y todavía no está activo para todos los comercios. Si lo pides y no está activo para tu cuenta, crear el enlace responde 400 con { "error": "split_no_disponible" } y no se crea nada. Escríbenos para entrar al piloto.

Un enlace de pago puede repartir lo que te llega de ese pago entre hasta 5 cuentas además de la tuya: por porcentaje o por monto fijo. Lo que sobra es tuyo.

El reparto se hace sobre el neto: lo que pagó tu cliente (con la propina, si agregó una) menos la comisión. Corre con la liquidación inmediata: tu cuenta necesita tenerla activa.

Antes de empezar: aprueba las cuentas

Sólo se reparte a cuentas que tú aprobaste en el portal, en Ajustes → Cuentas para pago dividido (hasta 20). Una cuenta que no esté ahí se rechaza al crear el enlace con 400 split_cuenta_no_preaprobada.

Es una protección: las cuentas aprobadas sólo se cambian desde el portal, no con tu llave. Si alguien llegara a tener tu llave, no podría mandar tu dinero a una cuenta suya.

La cuenta del enlace tiene que coincidir con la aprobada en tipo, banco, número y cédula o RIF del titular.

Crear un enlace con reparto

Agrega split al crear el enlace (POST /switch/v1/links):

bash
curl -s https://pay.pagaconquickpay.com/switch/v1/links \
  -H "x-switch-key: $QP_KEY" -H "content-type: application/json" \
  -d '{
    "monto": 100,
    "concepto": "Pedido 1234",
    "split": [
      { "cuenta": { "tipo": "cuenta", "valor": "01020000000000000001", "banco": "0102", "identificacion": "V00000000", "nombre": "Socio Uno" }, "porcentaje": 30 },
      { "cuenta": { "tipo": "cuenta", "valor": "01020000000000000002", "banco": "0102", "identificacion": "V00000000", "nombre": "Socio Dos" }, "monto": 10 }
    ]
  }'

Cada elemento de split lleva:

CampoQué es
cuentaLa cuenta que recibe: tipo (cuenta o telefono), valor, banco (código de 4 dígitos), identificacion y nombre (hasta 40 caracteres)
porcentajePorcentaje del neto, mayor que 0 y hasta 100, con 2 decimales como máximo
montoMonto fijo en la moneda del enlace, con 2 decimales como máximo

Cada beneficiario lleva porcentaje o monto, no los dos. La respuesta de crear trae el mismo split que guardamos.

Todo se valida al crear el enlace y queda fijo: un enlace no se edita, así que para cambiar el reparto se cancela y se crea otro.

HTTPerrorCuándo
400split_no_disponibleEl pago dividido no está activo para tu cuenta
400split_invalidoFalta un dato de la cuenta, viene porcentaje y monto a la vez (o ninguno), o un campo desconocido. detail dice cuál
400split_max_beneficiariosMás de 5 beneficiarios
400 o 422split_excede_netoLos porcentajes suman más de 100 (400), o el reparto pasa del neto de ese monto después de la comisión (422)
422split_requiere_liquidacion_inmediataTu cuenta no tiene liquidación inmediata
400split_cuenta_no_preaprobadaUna de las cuentas no está entre las que aprobaste en el portal. detail dice cuál (split[1]: …)
400split_beneficiario_bloqueadoUn control de seguridad no permite pagarle a una de las cuentas, o esa cuenta pasa el tope diario por beneficiario. detail dice cuál
503split_no_disponible_ahoraNo pudimos revisar las cuentas en ese momento. No se creó nada: intenta de nuevo en unos minutos

Cómo se reparte

En el ejemplo, con una comisión del 1 %, el neto de Bs 100 es Bs 99:

QuiénReglaRecibe
Socio Uno30 %Bs 29,70
Socio DosBs 10 fijosBs 10,00
Túel restoBs 59,30

Ver el reparto

GET /switch/v1/links/:id de un enlace con reparto trae, además de lo de siempre:

json
{
  "split": [ "…las reglas…" ],
  "reparto": {
    "estado": "repartido",
    "moneda": "VES",
    "monto_comercio": 59.3,
    "monto_repartido": 39.7,
    "beneficiarios": [
      { "banco": "0102", "tipo": "cuenta", "ultimos4": "0001", "nombre": "Socio Uno", "porcentaje": 30, "monto_fijo": null,
        "monto": 29.7, "estado": "pagado", "referencia_bancaria": "70000001", "liquidacion_txn_id": "…" }
    ]
  }
}

reparto.estado es pendiente (falta pagar alguna parte), repartido (todo pagado), en_revision (algo lo está revisando una persona) o cerrado (terminó, pero alguna parte se cerró sin pagar). Cada beneficiario tiene estado pendiente, pagado, en_revision, sin_monto (su parte dio menos de un céntimo) o descartado (se cerró sin pagarle). Las cuentas van enmascaradas: banco, tipo, últimos 4 dígitos y nombre.

En el portal, el detalle de cada transacción con reparto muestra lo mismo.

El aviso link.acreditado

Con reparto, link.acreditado llega cuando todo el reparto terminó (no antes): cada parte pagada, o cerrada sin pagar por una persona. Trae:

Si el reparto se llevó todo el neto, no hay transferencia a tu cuenta: monto_acreditado es 0 y liquidacion_txn_id es el id del pago de tu cliente. → Webhooks

Reintegros

Con tu llave en vivo (sk_live), POST /switch/v1/reintegro responde 403 reintegro_no_habilitado. Con tu llave de prueba (sk_test) funciona como se describe aquí.

Si el reparto ya le pagó (o está pagándole) a algún beneficiario, POST /switch/v1/reintegro de ese pago responde 409 cobro_con_split_repartido: devolverle todo a tu cliente sería pagar dos veces. Escríbenos y lo resolvemos.

Si el reintegro se hace antes de que se reparta, el reparto se detiene y queda en revisión.

En modo prueba

Con una sk_test_ el reparto se simula: no se transfiere nada, y el aviso link.acreditado (con mode: "test") trae el reparto calculado igual que en producción. Las cuentas también tienen que estar aprobadas en el portal, así ves el mismo rechazo que verás en producción.

Integración para bots de terceros — cómo un bot cobra con QuickPay

¿Tienes un bot de WhatsApp, Telegram o tu propia app? Integra QuickPay en 3 pasos y cobra a tus clientes sin construir infraestructura bancaria.

El flujo es simple: tu bot crea un link de pago, lo envía en un mensaje con botón, QuickPay cobra, y te avisa por webhook.

Flujo de pago del usuario final

1. Cliente abre WhatsApp → ve mensaje de tu bot con botón "Pagar"
2. Toca el botón → abre en WhatsApp el checkout hosteado de QuickPay
3. Selecciona su banco, autoriza con la clave de 8 dígitos que le envía su banco (SMS, notificación o correo)
4. QuickPay cobra y, si enviaste `success_url`, lo devuelve a tu web
5. Tu bot se entera por webhook → entrega el servicio

Paso 1: Obtén tu llave

  1. Abre tu cuenta de comercio en el portal (con tu cédula o el RIF de tu empresa).
  2. En Integraciones › Llaves de API, crea una llave de prueba. Tiene la forma tu-comercio:sk_test_… y se muestra una sola vez.
  3. Guárdala en una variable de entorno de tu servidor (nunca en el código del bot que corre en el teléfono del cliente).

Cuando todo funcione en prueba, crea la de producción: → Pasar a producción

Cuando un cliente quiera pagar, crea un link:

Ejemplo: bot de Node.js

js
const axios = require('axios');

async function crearLinkDePago(monto, concepto, metaDatos) {
  const response = await axios.post(
    'https://pay.pagaconquickpay.com/switch/v1/links',
    {
      monto,
      concepto,
      expira_horas: 24,
      metadata: metaDatos,          // tus datos; vuelven al crear, no en el webhook
      idempotency_key: metaDatos.orden, // reintentar no duplica el cobro
    },
    {
      headers: {
        'x-switch-key': process.env.QUICKPAY_KEY,
        'content-type': 'application/json'
      }
    }
  );

  return response.data;
}

// Uso
const link = await crearLinkDePago(
  450.00,
  'Crédito bot de consultoría',
  { cliente_id: 'CLI-001', orden: 'ORD-2026-100' }
);

console.log('Link de pago:', link.url);
// Guarda link.id junto a la orden: el webhook te dirá ese id cuando la paguen.

Ejemplo: bot de Python

python
import requests
import os

def crear_link_de_pago(monto, concepto, metadatos):
    response = requests.post(
        'https://pay.pagaconquickpay.com/switch/v1/links',
        json={
            'monto': monto,
            'concepto': concepto,
            'expira_horas': 24,
            'metadata': metadatos,
            'idempotency_key': metadatos['orden'],
        },
        headers={
            'x-switch-key': os.environ['QUICKPAY_KEY'],
            'content-type': 'application/json'
        }
    )
    
    return response.json()

# Uso
link = crear_link_de_pago(
    450.00,
    'Crédito bot de consultoría',
    {'cliente_id': 'CLI-001', 'orden': 'ORD-2026-100'}
)

print(f"Link: {link['url']}")

Ejemplo: bot de Make/n8n (sin código)

Make.com:

  1. HTTP Request a POST https://pay.pagaconquickpay.com/switch/v1/links
  2. Headers: x-switch-key: {{QUICKPAY_KEY}}
  3. Body (JSON): ``json { "monto": {{monto}}, "concepto": "{{concepto}}", "expira_horas": 24, "metadata": { "cliente_id": "{{cliente_id}}" } } ``
  1. Extrae data.url de la respuesta.
  1. Continúa con el resto de tu flow (enviar a WhatsApp, etc.).

Una vez tienes la URL, envía un mensaje interactivo con botón al cliente.

3.1 Si usas WhatsApp Cloud API

js
const axios = require('axios');

async function enviarPagoWhatsApp(numeroCliente, urlPago, monto) {
  await axios.post(
    `https://graph.facebook.com/v18.0/${process.env.WA_PHONE_ID}/messages`,
    {
      messaging_product: 'whatsapp',
      to: numeroCliente,
      type: 'interactive',
      interactive: {
        type: 'cta_url',
        body: {
          text: `Hola, tienes un pago de Bs ${monto.toFixed(2)} pendiente. Puedes pagarlo desde cualquier banco.`
        },
        footer: {
          text: 'Powered by QuickPay'
        },
        action: {
          name: 'cta_url',
          parameters: { display_text: 'Pagar ahora', url: urlPago }
        }
      }
    },
    {
      headers: {
        'Authorization': `Bearer ${process.env.WA_TOKEN}`
      }
    }
  );
}

3.2 Si usas Make/n8n/Zapier

Paso 4: Recibe la confirmación de pago (webhook)

Registra la URL de tu bot en Integraciones › Webhooks (o con POST /switch/v1/webhooks). Cuando tu cliente paga, te llega link.pagado con el link_id: búscalo en tu base, verifica la firma v2 y confírmale al cliente por WhatsApp. → Webhooks

Paso 5: Entrega el servicio/producto

El aviso trae el link_id, no tus metadata: busca la orden que guardaste con ese id.

js
// En tu handler del webhook (después de verificar la firma)
if (event.type === 'link.pagado') {
  const orden = await BD.buscarOrden({ link_id: event.data.link_id });
  if (!orden || orden.estado === 'pagado') return; // ya entregada: el aviso puede llegar dos veces

  await BD.actualizar({ link_id: event.data.link_id }, { estado: 'pagado', pagado_en: new Date() });
  await entregarServicio(orden.cliente_id, orden.id);
  await enviarConfirmacion(orden.cliente_id);
}

Flujo completo (ejemplo real)

Bot de créditos educativos:

js
const express = require('express');
const axios = require('axios');

const app = express();
app.use(express.json());

// Cliente envía: "/pagar 450 Matricula"
app.post('/api/iniciar-pago', async (req, res) => {
  const { cliente_id, monto, concepto } = req.body;

  // 1. Crear link de pago
  const link = await axios.post(
    'https://pay.pagaconquickpay.com/switch/v1/links',
    {
      monto,
      concepto,
      metadata: { cliente_id }
    },
    { headers: { 'x-switch-key': process.env.QUICKPAY_KEY } }
  );

  // 2. Guardar orden pendiente
  await BD.insertOne({
    cliente_id,
    link_id: link.data.id,
    monto,
    concepto,
    estado: 'pendiente'
  });

  // 3. Enviar botón a WhatsApp
  await axios.post(`https://graph.facebook.com/v18.0/${process.env.WA_PHONE_ID}/messages`, {
    messaging_product: 'whatsapp',
    to: cliente_id,
    type: 'interactive',
    interactive: {
      type: 'cta_url',
      body: { text: `Hola, tienes un pago de Bs ${monto} por ${concepto}.` },
      action: {
        name: 'cta_url',
        parameters: { display_text: 'Pagar ahora', url: link.data.url }
      }
    }
  }, {
    headers: { 'Authorization': `Bearer ${process.env.WA_TOKEN}` }
  });

  res.json({ link: link.data.url });
});

// 4. Webhook de confirmación (verifica la firma v2 antes: ver Webhooks)
app.post('/webhooks/quickpay', async (req, res) => {
  const event = req.body;

  if (event.type === 'link.pagado') {
    // El aviso trae link_id: con él encuentras la orden que guardaste en el paso 2
    const orden = await BD.findOne({ link_id: event.data.link_id, estado: 'pendiente' });
    if (!orden) return res.status(200).send('OK'); // repetido o desconocido
    const cliente_id = orden.cliente_id;

    await BD.updateOne({ link_id: event.data.link_id }, { estado: 'pagado', pagado_en: new Date() });

    // Envía confirmación a WhatsApp
    axios.post(`https://graph.facebook.com/v18.0/${process.env.WA_PHONE_ID}/messages`, {
      messaging_product: 'whatsapp',
      to: cliente_id,
      type: 'text',
      text: { body: '✓ Pago confirmado. Tu matrícula está activa.' }
    }, {
      headers: { 'Authorization': `Bearer ${process.env.WA_TOKEN}` }
    });
  }

  res.status(200).send('OK');
});

app.listen(3000);

Checklist de implementación

Troubleshooting

ProblemaSolución
"unauthorized" (401)Verifica que x-switch-key está en formato comercio:sk_test_xxx
Link devuelve estado "pendiente"Normal, espera el webhook. Cliente aún no pagó.
No recibo webhookVerifica que tu URL es HTTPS, responde 200 y tu firewall no bloquea.
"Invalid signature"Asegúrate de capturar el raw body antes de parsear JSON.
Cliente se sale del checkoutNormal, espera a que intente de nuevo o el link expire (24h default).

Seguridad

Próximos pasos

Soporte

Escríbenos por WhatsApp desde el enlace Soporte al pie de esta página.

Volver a tu web y verificar

Al crear el enlace puedes indicar a dónde vuelve tu cliente cuando termina de pagar:

json
{ "monto": 150, "concepto": "Pedido #1024", "success_url": "https://tu-tienda.com/gracias?pedido=1024" }

success_url debe empezar con https://. Cuando el enlace tiene success_url, la página de pago se abre con una pantalla de 2,5 segundos que muestra el nombre de tu comercio, el concepto y el monto, y avisa que el pago lo procesa QuickPay. Tu cliente puede saltarla con Continuar; si recarga la página, no se repite.

Al confirmarse el pago, la página muestra arriba "Volviendo a <tu comercio> en 3 s" con la cuenta regresiva y el botón Volver ahora, y abre tu dirección con dos datos agregados:

https://tu-tienda.com/gracias?pedido=1024&estado=pagado&referencia=10242808

Si tu cliente pagó con tarjeta (piloto), vuelve igual: referencia es la operación QuickPay (8 caracteres) en lugar de la referencia bancaria.

Cuando el pago no puede continuar: failure_url

json
{ "monto": 150, "concepto": "Pedido #1024", "success_url": "https://tu-tienda.com/gracias?pedido=1024", "failure_url": "https://tu-tienda.com/pago-fallido?pedido=1024" }

También debe empezar con https://. Tu cliente vuelve a esa dirección, con estado agregado, en estos casos:

estadoCuándo
expiradoAbre el enlace cuando ya venció, o vence mientras tu cliente está pagando
canceladoAbre el enlace cuando ya lo cancelaste, o lo cancelas mientras tu cliente está pagando
rechazadoEl banco rechazó el pago y tu cliente elige Cancelar y volver
https://tu-tienda.com/pago-fallido?pedido=1024&estado=rechazado

Si el banco rechaza, tu cliente no vuelve solo: se queda en la página de pago para intentarlo otra vez, y ahí aparece el botón Cancelar y volver. Si no pones failure_url, el botón no aparece y un enlace vencido o cancelado sólo muestra su aviso.

failure_url tampoco es prueba de nada. Que tu cliente llegue ahí no significa que no haya pagado (por ejemplo, pudo pagar en otra pestaña). Antes de cancelar un pedido, consulta el cobro.

Volver a tu web no prueba el pago. Cualquiera puede escribir esa dirección en su navegador. Antes de entregar, confirma que el cobro está pagado: con el webhook link.pagado o con una consulta.

Verificar desde tu página de "gracias"

Cuando el cliente llega a tu success_url, tu servidor consulta el cobro:

bash
curl -s https://pay.pagaconquickpay.com/switch/v1/links/<id> -H "x-switch-key: $QP_KEY"
estadoQué muestras
pagado"¡Gracias! Tu pago fue confirmado."
procesando o revision"Tu banco está confirmando el pago. Te avisaremos." (no le pidas pagar otra vez)
pendiente"Todavía no recibimos tu pago." con un enlace para intentarlo

Guarda el id del cobro junto a tu pedido al crearlo: así sabes cuál consultar.

Webhooks

Un webhook es un aviso que QuickPay le manda a tu servidor (un POST con JSON) cuando pasa algo con tus cobros. Es la forma recomendada de enterarte de un pago: no tienes que consultar.

Eventos

EventoCuándo llega
link.pagadoEl banco confirmó el pago de un cobro: ya puedes entregar
link.acreditadoTe transferimos el neto de ese pago a tu cuenta. Llega con la liquidación inmediata, que se está activando por etapas
link.devueltoUna devolución que hiciste desde el portal llegó a tu cliente. Las devoluciones están en piloto: si no están activas para tu cuenta, este aviso no llega
transaccion.aprobadaAPI directa: el banco confirmó la operación (LIQUIDADA). Llega una sola vez por operación, junto con transaccion.liquidada
transaccion.liquidadaAPI directa: la operación quedó LIQUIDADA (confirmada por el banco)
transaccion.rechazadaAPI directa: el banco rechazó la operación (RECHAZADA)

link.pagado sale cuando el banco confirma que el dinero se movió, no cuando recibe la orden de débito. Según el banco de tu cliente, la confirmación puede llegar en el mismo momento del pago o el cobro pasa primero por procesando y el aviso llega cuando el banco lo confirma: suele tardar menos de un minuto, pero a veces tarda bastante más. Si el banco no lo aprueba, el cobro vuelve a pendiente y no llega ningún link.pagado. Llega una sola vez por cobro. → Estados de un cobro

transaccion.aprobada sigue la misma regla: sale cuando el banco confirma la operación (LIQUIDADA), no cuando recibe la orden de débito (ACEPTADA, "enviada a BCV"). Por eso llega junto con transaccion.liquidada y su data.estado es "LIQUIDADA". Con una llave de prueba, el cobro simulado avisa transaccion.aprobada en el acto con data.estado: "ACEPTADA" y referencia: "SIMULADO". El cuerpo de los avisos transaccion.* es { "type", "sentAt", "data": { "id", "estado", "monto", "moneda", "concepto", "referencia", "operacion" } }, donde data.id es el id que te devolvió la operación.

data.operacion dice de qué es la transacción, para que un envío de dinero no se confunda con un pago que recibiste: cobro (te pagaron), pago (salió dinero: por ejemplo, la transferencia del neto a tu cuenta o un reintegro), reverso, y las tres de una devolución: devolucion_debito (el débito a tu cuenta, con la clave de tu banco, para devolverle a tu cliente), devolucion (el dinero que le llega a tu cliente) y devolucion_retorno (si el banco de tu cliente rechazó la devolución, te regresamos lo que te debitamos). Entrega mercancía sólo con operacion: "cobro".

1. Registra tu URL

Lo más fácil: en tu portal, Integraciones › Webhooks › Agregar URL (sirve aunque todavía no tengas llave de producción). O por API, con una llave sk_live_:

bash
curl -s https://pay.pagaconquickpay.com/switch/v1/webhooks \
  -H "x-switch-key: $QP_KEY" -H "content-type: application/json" \
  -d '{ "url": "https://tu-dominio.com/webhooks/quickpay", "eventos": ["link.pagado", "link.acreditado"] }'

El webhook recibe también los avisos de producción, así que crear, cambiar o borrar webhooks por API exige una sk_live_: con una sk_test_ responde 403 con { "error": "requiere_llave_live" }. Con la llave de prueba sí puedes listarlos y ver sus entregas. La URL debe empezar con https://. La respuesta trae el secret con el que verificas la firma: se muestra una sola vez, guárdalo.

Reglas de la URL:

2. Lo que te llega

Cabeceras:

CabeceraQué es
x-quicklink-eventEl evento, p. ej. link.pagado
x-quicklink-timestampSegundos desde 1970 (UTC) en que se firmó
x-quicklink-signature-v2v2=<hex>: HMAC-SHA256 de timestamp + "." + cuerpo
x-quicklink-signaturesha256=<hex>: HMAC-SHA256 del cuerpo (firma anterior, se mantiene por compatibilidad)

Cuerpo de link.pagado:

json
{
  "type": "link.pagado",
  "sentAt": "2026-10-08T14:03:22.000Z",
  "data": {
    "link_id": "3f6c2a9e-8b1d-4c7a-9e2f-5a1b7c3d9e40",
    "txn_id": "b639fac6-1d2e-4f00-9a1b-3c4d5e6f7a8b",
    "estado": "pagado",
    "monto": 150,
    "moneda": "VES",
    "concepto": "Pedido #1024",
    "referencia": "10242808",
    "mode": "live",
    "codigo_verificacion": "QP-7K3M9-XQ4TA",
    "propina": 0,
    "total": 150,
    "pagador": { "alta_cliente": false }
  }
}

monto es lo que pidió el cobro. Si activaste propinas y tu cliente agregó una, viene en propina y total es lo que se le debitó (monto + propina, en un solo débito). Sin propina, propina es 0 y total es igual a monto.

codigo_verificacion es el código que lleva el comprobante de tu cliente: sirve para verificar que es auténtico. Puede venir null; ignóralo en ese caso.

pagador.alta_cliente es true si quien pagó marcó en la página de pago "Quiero ser cliente de tu comercio y recibir sus novedades". Esa persona ya aparece en Clientes del portal; el aviso no trae su cédula, teléfono ni nombre. → Página de pago

mode dice si el aviso es de un cobro de producción (live) o de prueba (test). En link.acreditado viene igual.

metodo sólo viene cuando tu cliente pagó con tarjeta (piloto): "metodo": "tarjeta", recargo_tarjeta es el recargo por pago con tarjeta que pagó tu cliente (no se te liquida) y referencia es la del recibo de la tarjeta. monto, propina y total son los del cobro, sin el recargo. Con débito inmediato el aviso no trae metodo ni recargo_tarjeta.

Cuerpo de link.devuelto (piloto):

json
{
  "type": "link.devuelto",
  "sentAt": "2026-10-14T21:33:59.304Z",
  "data": {
    "link_id": "4e38874a-eb60-457b-ba53-371a74dbaff4",
    "devolucion_id": "786d2085-00d3-4f61-95c4-b7509cfb5276",
    "estado": "completada",
    "monto": 1,
    "monto_devuelto": 1,
    "moneda": "VES",
    "referencia_bancaria": "SIMULADO",
    "mode": "test"
  }
}

Con una llave de prueba referencia_bancaria llega como "SIMULADO"; en producción es la referencia del crédito a tu cliente.

monto es lo que se devolvió en esta devolución y monto_devuelto lo devuelto en total de ese cobro (una devolución puede ser parcial y un cobro puede tener varias). Llega una vez por devolución, cuando el dinero ya salió hacia tu cliente.

link.acreditado trae además liquidacion_txn_id, monto_bruto, comision y monto_acreditado. Con pago dividido (piloto) llega cuando todo el reparto terminó (cada parte pagada o cerrada sin pagar) y trae además reparto; monto_acreditado es sólo tu parte. Con propina, monto_bruto es el total (la comisión se calcula sobre lo debitado y la propina te llega con el resto del pago). Si devolviste parte de ese pago desde el portal antes de que te lo acreditáramos (piloto de devoluciones), monto_acreditado llega ya descontado: lo devuelto y el costo del banco de la devolución. En ese caso monto_acreditado es menor que monto_bruto − comision. Si devolviste todo lo que te tocaba, no llega link.acreditado. → Glosario

3. Verifica la firma (siempre)

Usa la firma v2 y rechaza avisos con más de 5 minutos: así nadie te reenvía uno viejo. Calcula sobre el cuerpo exacto que llegó, antes de parsearlo.

Node.js

js
import { createHmac, timingSafeEqual } from 'node:crypto';

function verificar(cuerpo, firma, timestamp, secreto) {
  if (!firma || !timestamp || Math.abs(Date.now() / 1000 - Number(timestamp)) > 300) return false;
  const esperado = Buffer.from('v2=' + createHmac('sha256', secreto).update(`${timestamp}.${cuerpo}`).digest('hex'));
  const recibido = Buffer.from(String(firma));
  return esperado.length === recibido.length && timingSafeEqual(esperado, recibido);
}

// Express: app.post('/webhooks/quickpay', express.text({ type: '*/*' }), (req, res) => { … })
//   verificar(req.body, req.get('x-quicklink-signature-v2'), req.get('x-quicklink-timestamp'), process.env.QUICKPAY_WEBHOOK_SECRET)

El SDK trae esto listo: verificarWebhook({ cuerpo, firma, timestamp, secreto }).

PHP

php
$cuerpo = file_get_contents('php://input');
$ts = $_SERVER['HTTP_X_QUICKLINK_TIMESTAMP'] ?? '';
$firma = $_SERVER['HTTP_X_QUICKLINK_SIGNATURE_V2'] ?? '';
$esperado = 'v2=' . hash_hmac('sha256', $ts . '.' . $cuerpo, getenv('QUICKPAY_WEBHOOK_SECRET'));
if (!$ts || abs(time() - (int)$ts) > 300 || !hash_equals($esperado, $firma)) { http_response_code(401); exit; }

4. Responde rápido

Responde 200 en menos de 8 segundos y procesa después. Si no respondemos con 2xx, reintentamos hasta 6 veces: de inmediato, a los 30 segundos, 2 minutos, 5 minutos, 15 minutos y 1 hora.

5. No entregues dos veces

Un aviso puede llegar más de una vez (por los reintentos). Guarda qué link_id (en los avisos transaccion.*, data.id; en link.devuelto, devolucion_id) ya procesaste para cada evento y, si llega repetido, responde 200 sin volver a entregar.

6. Prueba y revisa las entregas

7. Administrar por API

MétodoRutaPara
GET/webhooksListar (sin el secreto). Sirve con cualquier llave
GET/webhooks/:idVer uno
PATCH/webhooks/:idCambiar url, eventos o estado (activo / inactivo). Sólo sk_live_
DELETE/webhooks/:idBorrar. Sólo sk_live_

Revisa data.mode antes de entregar. Llegan los avisos de prueba y los de producción al mismo webhook: si mode es test, el pago fue simulado y no debes entregar nada de verdad. → Modo prueba

Errores y rechazos

Cuando la API responde con error

El cuerpo siempre trae error y, a veces, detail:

json
{ "error": "validation", "detail": { "fieldErrors": { "monto": ["Number must be greater than 0"] } } }
HTTPerrorQué pasóQué haces
400validationUn campo falta o no es válido. Al listar enlaces con un filtro que no se entiende, viene además parametro con su nombre y detail es un textoRevisa detail (y parametro)
401unauthorizedFalta la llave, está mal escrita o fue revocadaRevisa x-switch-key
403comercio_suspendidoTu comercio está suspendido: no se pueden crear enlaces ni lotes (ni de prueba ni de producción)Escríbenos para reactivarlo
403requiere_llave_liveCon una llave de prueba intentaste crear o revocar una llave de producciónUsa una sk_live_ → Llaves
404not_foundEse cobro no existe o no es de tu comercioRevisa el id
409p. ej. item_duplicadoConflicto: en un lote, una idempotency_key de ítem ya usadaRevisa detail
409limite_webhooksYa tienes 10 webhooks registradosBorra uno que no uses → Webhooks
422destino_bloqueadoLa URL del webhook apunta a una red internaUsa una URL pública → Webhooks
400 / 422 / 503split_…El pago dividido no está activo, el reparto no es válido, una cuenta no está aprobada en el portal o un control de seguridad la frena→ Pago dividido
409idempotency_key_en_usoEsa idempotency_key ya la usaste con una llave del otro modo (prueba o producción)Usa otra llave de idempotencia
409tope_diario_excedido / tope_acumulado_excedidoAl pedir la clave de pago (página de pago, WhatsApp Flow o POST /cobrar/token): ese cobro pasaría el tope de lo que tu cuenta puede recibir hoy o en total. Trae motivo (el texto para tu cliente); con tu llave, además tope y usado (en Bs) y, si tu tope está en dólares, topes_moneda, tope_usd y tasa_bcvTu cliente no paga ahora; escríbenos si necesitas más tope → Límites
429—Pasaste el límite de peticionesEspera y reintenta → Límites
503cierre_bancarioEn la página de pago, al pedir la clave entre las 11:45 p. m. y la 1:30 a. m. (hora de Venezuela): los bancos están en su cierre diario. Trae motivo (el texto para tu cliente) y reintentar_en (segundos hasta que termine)Tu cliente paga después de la 1:30 a. m. con el mismo enlace → Cierre diario
5xx—Falla nuestraReintenta con la misma idempotency_key

Cuando el banco rechaza el pago

Eso no te llega como error de la API: tu cliente lo ve en la página de pago ("El banco no aprobó el pago") y puede intentarlo otra vez con una clave nueva. El cobro sigue pendiente hasta que lo pague o venza.

Si tu comercio está suspendido

Mientras dure la suspensión:

Reintentar sin duplicar

Si una creación falla por red o por un 5xx, reintenta con la misma idempotency_key: si el primer intento sí llegó, recibes el mismo enlace en vez de uno nuevo.

json
{ "monto": 150, "concepto": "Pedido #1024", "idempotency_key": "pedido-1024" }

Modo prueba

Con tu llave de prueba (sk_test_…) haces el ciclo completo sin mover dinero: creas cobros, los pagas, te llegan los webhooks firmados y los ves en tu portal.

Cómo se paga un cobro de prueba

Abre su url: la página muestra "Modo prueba". Llénala con datos de ejemplo:

CampoEjemplo
BancoCualquiera de la lista
Teléfono0414 + 1234567
CédulaV + 12345678
Clave de pagoCualquier número de 8 dígitos, p. ej. 12345678 (o una de las claves de la tabla de abajo, para forzar un resultado)

No se le pide nada a ningún banco ni llega ningún mensaje: con una clave cualquiera el pago se aprueba y el cobro pasa a pagado.

Forzar un resultado

El modo prueba te deja provocar los casos difíciles para que pruebes tu manejo de cada uno. Sólo funciona en cobros creados con una llave sk_test_…; en un cobro de producción estas claves no hacen nada especial (se tratan como cualquier clave y las valida el banco).

Con la clave de pago

En el paso de la clave, escribe una de estas para provocar cada desenlace. Cualquier otra clave de 8 dígitos aprueba. El monto y el banco elegido no cambian el resultado: lo decide sólo la clave.

Clave de pagoDesenlaceQué vesQué te llega
Cualquier otra de 8 dígitosAprobadoEl cobro pasa a pagado y la página muestra el comprobante.link.pagado
11111111Rechazado (rechazo genérico)El cobro sigue pendiente, la página muestra el rechazo y tu cliente puede intentarlo con otra clave.Nada
11111112Rechazado por fondosIgual que el anterior, con el aviso "Saldo insuficiente". Motivo SALDO_INSUFICIENTE.Nada
11111113Rechazado por clave inválidaIgual, con el aviso "La clave de pago no es válida". Motivo OTP_INVALIDO.Nada
11111114Banco no disponibleIgual, con el aviso "El banco no está disponible en este momento". Motivo BANCO_NO_DISPONIBLE.Nada
22222222Pendiente y luego apruebaEl pago queda procesando. A los 30 segundos más o menos pasa solo a pagado. Mientras tanto no se puede volver a pagar.link.pagado, recién a los 30 s
33333333Tarda en confirmarLa página se queda en "Procesando tu pago" unos 8 segundos y luego aprueba.link.pagado, al aprobar

En producción, según el banco de quien paga, un pago puede pasar primero por procesando y link.pagado llega cuando el banco lo confirma. En modo prueba, "Cualquier otra" aprueba en el acto; para probar cómo maneja tu sistema la espera, usa 22222222.

Los rechazos siguen el mismo camino que un rechazo real del banco: el cobro se libera, el intento queda registrado como rechazado y no sale ningún webhook (un cobro rechazado no tiene aviso). Las dos formas de aprobar sí disparan los mismos webhooks que en producción, con "mode": "test".

Solo funcionan en modo prueba. Se aplican únicamente a un cobro creado con una llave sk_test_…. Con una llave sk_live_…, y en cualquier cobro de producción, estas claves no hacen nada especial: se tratan como cualquier clave y las valida el banco. Ninguna llave ni dato de la petición puede encenderlas: lo decide el modo con que se creó el cobro, y ese modo no cambia.

Sin abrir la página: POST /links/:id/simular

Para que tu servidor maneje un cobro de punta a punta sin abrir la página de pago:

bash
curl -s -X POST https://pay.pagaconquickpay.com/switch/v1/links/<id>/simular \
  -H "x-switch-key: $QP_TEST_KEY" -H "content-type: application/json" \
  -d '{ "resultado": "pagado" }'
resultadoQué haceRespuesta
pagadoMarca el cobro pagado y dispara los mismos avisos que un pago real. Te llega link.pagado (con "referencia": "SIMULADO"). Si tu comercio tiene liquidación inmediata activa, también te llega un link.acreditado simulado.200 con "estado": "pagado"
rechazadoSimula que el banco rechazó: el cobro queda pendiente, sin cambios y sin webhook. Sirve para confirmar que tu sistema sigue esperando.200 con "estado": "pendiente"
expiradoVence el cobro al instante (expirado).200 con "estado": "expirado"

La respuesta incluye "simulado": true. Si el cobro no es de prueba, recibes 403 (solo_modo_prueba). Si ya no está pendiente (o está vencido por tiempo), 409 (no_simulable). Un cobro en procesando por la clave 22222222 se puede adelantar con pagado.

Todos los avisos de prueba traen "mode": "test" dentro de data. → Webhooks

Qué pasa igual que en producción

Lo que el modo prueba no hace

Un cobro de prueba nunca se vuelve real, aunque lo abra alguien de verdad con su clave del banco. Y uno de producción nunca es de prueba: no mezcles llaves en el mismo pedido.

Si algo no funciona en producción

La página de estado muestra si el servicio y los cobros con débito inmediato están operativos, y los incidentes recientes. Los mismos datos están en /estado.json, sin llave.

Pasar a producción

Antes de cobrar de verdad, comprueba en prueba

El día que pasas

Lo único que cambia es la llave:

  1. Tu cuenta debe estar aprobada (el portal te muestra "Puede cobrar" en Ajustes).
  2. En Integraciones › Llaves de API, crea una llave de Producción (sk_live_…).
  3. Cámbiala en tu servidor.
  4. Haz un cobro real pequeño y confírmalo de punta a punta.

Los avisos de prueba y de producción llegan al mismo webhook (por eso crearlo o cambiarlo por API exige sk_live_; desde el portal puedes registrarlo antes de tener la llave de producción), pero cada uno trae data.mode (test o live). Si es test, el pago fue simulado: no entregues de verdad.

API directa (aliados)

Para aliados con contrato. Si eres un comercio, no necesitas esto: usa enlaces de pago, donde QuickPay pide la clave del banco por ti. La API directa es para quien muestra su propia pantalla de pago (por ejemplo, un bot que pide la clave dentro de su conversación) o envía pagos.

Una sola integración para cobrar y pagar sobre todos los rieles bancarios del país. Tú dices qué quieres (cobrar/pagar Bs X a Y); QuickPay decide cómo y por cuál banco.

En esta guía vas a, con curl puro y copy-paste:

  1. Conseguir tu API key y autenticarte.
  2. Hacer tu primer cobro (débito inmediato con OTP).
  3. Enviar un pago a un beneficiario.
  4. Consultar el estado de una operación.
  5. Recibir webhooks de cambios de estado.
  6. Manejar errores y rechazos.

Convención. A lo largo de la guía usamos la variable {{base_url}} como host del API. Sustitúyela por la URL que te entregamos (producción: https://pay.pagaconquickpay.com). Define una variable de entorno para copiar-pegar sin editar:

bash
export base_url="https://pay.pagaconquickpay.com"

1. Obtén tu API key

Toda llamada se autentica con la cabecera x-switch-key en formato:

x-switch-key: <comercio>:<api_key>
LlavePrefijoQué hace
Pruebask_test_…Ambiente de ensayo. No mueve dinero real (sandbox simulado en QA).
Producciónsk_live_…Mueve dinero real sobre los bancos.

El modo lo fija la llave, no tu código. No envías ningún campo mode ni test=true: el servidor deriva el modo (test/live) del prefijo de la API key. La misma petición, con sk_test_… corre simulada y con sk_live_… mueve dinero. Cambias de ambiente cambiando una sola cosa: la llave.

Guarda tu llave en una variable para el resto de la guía. Empieza siempre en test:

bash
export SWITCH_KEY="acme:sk_test_xxxxxxxxxxxxxxxxxxxxxxxx"

Verifica que tu llave funciona pidiendo tus transacciones (no mueve dinero):

bash
curl -s "$base_url/switch/v1/transacciones?limit=1" \
  -H "x-switch-key: $SWITCH_KEY"

Respuesta esperada (HTTP 200): un arreglo con tus transacciones ([] si todavía no tienes ninguna).

Si recibes 401 {"error":"unauthorized"}, revisa el formato <comercio>:<api_key> y que la llave esté activa.

Conceptos que vas a usar en todas las llamadas


2. Tu primer cobro (débito inmediato / C2P)

cobrar debita al pagador (le cobras a una persona). Es un débito inmediato y suele requerir un OTP que el banco del pagador le envía. El flujo son 2 pasos:

POST /cobrar/token   →   (el pagador recibe un OTP de su banco, ~120s de validez)
POST /cobrar         →   (envías ese OTP y se ejecuta el cobro)

Paso 2.1 — Solicitar el OTP

POST /switch/v1/cobrar/token con el mismo cuerpo del cobro sin el otp. cobrador eres tú (recibes el dinero); pagador es quien paga.

bash
IDEM=$(uuidgen | tr 'A-Z' 'a-z')

curl -s -X POST "$base_url/switch/v1/cobrar/token" \
  -H "x-switch-key: $SWITCH_KEY" \
  -H "content-type: application/json" \
  -d "{
    \"idempotency_key\": \"$IDEM\",
    \"monto\": { \"valor\": 320.00, \"moneda\": \"VES\" },
    \"concepto\": \"Matricula 2026-1\",
    \"canal\": \"boton_pago\",
    \"cobrador\": {
      \"tipo\": \"cuenta\", \"valor\": \"01020000011234567890\", \"banco\": \"0102\",
      \"identificacion\": \"J123456789\", \"nombre\": \"ACME C.A.\"
    },
    \"pagador\": {
      \"tipo\": \"telefono\", \"valor\": \"04125551234\", \"banco\": \"0105\",
      \"identificacion\": \"V12345678\", \"nombre\": \"Ana Perez\"
    }
  }"

Respuesta (Resultado):

json
{
  "id": "qp_txn_018f3a...",
  "estado": "ACEPTADA",
  "referencia_banco": "12345678",
  "endtoend": null,
  "motivo_rechazo": null,
  "intentos": 1
}

ACEPTADA aquí significa "OTP solicitado": el pagador ya recibió el código en su teléfono. El token vive ~120 segundos.

Si tu cuenta tiene tope de lo que recibe (por día o en total) y este cobro lo pasaría, no se pide el OTP: responde 409 con { "error": "tope_diario_excedido", "motivo": "…", "tope": 50000, "usado": 49500 } (o tope_acumulado_excedido). tope y usado van siempre en Bs. Si tu tope está en dólares, se agregan "topes_moneda": "USD", "tope_usd" (el tope tal como está fijado) y "tasa_bcv" (los Bs por dólar con que se convirtió); tope es tope_usd × tasa_bcv. Sólo frena aquí: un /cobrar con un OTP ya pedido no se frena por el tope. → Límites

En modo test el OTP es simulado; usa 12345678 en el paso siguiente.

Paso 2.2 — Ejecutar el cobro con el OTP

Toma el OTP que te da el pagador y llama a POST /switch/v1/cobrar. Es el mismo cuerpo del paso anterior más el campo otp. Reutiliza el mismo idempotency_key del flujo de cobro:

bash
curl -s -X POST "$base_url/switch/v1/cobrar" \
  -H "x-switch-key: $SWITCH_KEY" \
  -H "content-type: application/json" \
  -d "{
    \"idempotency_key\": \"$IDEM\",
    \"monto\": { \"valor\": 320.00, \"moneda\": \"VES\" },
    \"concepto\": \"Matricula 2026-1\",
    \"canal\": \"boton_pago\",
    \"otp\": \"12345678\",
    \"cobrador\": {
      \"tipo\": \"cuenta\", \"valor\": \"01020000011234567890\", \"banco\": \"0102\",
      \"identificacion\": \"J123456789\", \"nombre\": \"ACME C.A.\"
    },
    \"pagador\": {
      \"tipo\": \"telefono\", \"valor\": \"04125551234\", \"banco\": \"0105\",
      \"identificacion\": \"V12345678\", \"nombre\": \"Ana Perez\"
    }
  }"

Respuesta:

json
{
  "id": "qp_txn_018f3a...",
  "estado": "LIQUIDADA",
  "referencia_banco": "98765432",
  "endtoend": "0000001234567890",
  "motivo_rechazo": null,
  "intentos": 1
}

Atajo: si ya capturaste el OTP por tu cuenta (p. ej. el banco del pagador lo entrega in-band), puedes llamar directo a /cobrar con el otp, sin el paso 2.1.


3. Envía un pago (payout)

pagar envía dinero desde tu tesorería a un beneficiario. Aquí ordenante eres tú (de dónde sale el dinero) y beneficiario es quien recibe.

Quién puede usarlo: pagar debita una cuenta de QuickPay, no un saldo tuyo en QuickPay. Por eso sólo lo usan las integraciones que QuickPay habilita. Con una llave de comercio (sk_test o sk_live) sin esa habilitación responde 403 con { "error": "pagar_no_habilitado" }, y lo mismo POST /switch/v1/dispersiones.

La pieza clave es via, que elige el riel de envío:

viaRielCuándoDestinoResultado
credito_inmediato (default)Crédito Inmediato (CCE)Predominanteteléfono o cuentaLiquida en BCV de forma asíncrona → ACEPTADA, luego LIQUIDADA por consulta/webhook
pago_movilPago entre teléfonos (P2P)Alterno (p. ej. reintegros)solo teléfonoInstantáneo → LIQUIDADA

Reglas de oro:

bash
IDEM=$(uuidgen | tr 'A-Z' 'a-z')

curl -s -X POST "$base_url/switch/v1/pagar" \
  -H "x-switch-key: $SWITCH_KEY" \
  -H "content-type: application/json" \
  -d "{
    \"idempotency_key\": \"$IDEM\",
    \"monto\": { \"valor\": 250.00, \"moneda\": \"VES\" },
    \"concepto\": \"Reintegro\",
    \"proposito\": \"transferencia\",
    \"via\": \"credito_inmediato\",
    \"canal\": \"billetera_digital\",
    \"ordenante\": {
      \"tipo\": \"cuenta\", \"valor\": \"01020000011234567890\", \"banco\": \"0102\",
      \"identificacion\": \"J123456789\", \"nombre\": \"ACME C.A.\"
    },
    \"beneficiario\": {
      \"tipo\": \"telefono\", \"valor\": \"04145556677\", \"banco\": \"0134\",
      \"identificacion\": \"V87654321\", \"nombre\": \"Maria Gomez\"
    }
  }"

Respuesta:

json
{
  "id": "qp_txn_018f4b...",
  "estado": "ACEPTADA",
  "referencia_banco": "55512345",
  "endtoend": "0000009876543210",
  "motivo_rechazo": null,
  "intentos": 1
}

Por credito_inmediato lo normal es recibir ACEPTADA (enviada a BCV) y que confirme a LIQUIDADA poco después. Para enterarte de ese cambio: consulta (sección 4) o suscríbete a webhooks (sección 5).

Campos opcionales de pagar: proposito (transferencia | nomina | proveedor, default transferencia) y via (default credito_inmediato). Para un pago entre teléfonos (P2P) usa "via": "pago_movil".


4. Consulta el estado (ACEPTADA → LIQUIDADA)

La liquidación interbancaria es asíncrona. Una operación puede quedar PENDIENTE/ACEPTADA y confirmarse después. Usa POST /switch/v1/consultar con el id que te devolvió cobrar/pagar:

bash
curl -s -X POST "$base_url/switch/v1/consultar" \
  -H "x-switch-key: $SWITCH_KEY" \
  -H "content-type: application/json" \
  -d '{ "id": "qp_txn_018f4b..." }'

Respuesta (estado actualizado):

json
{
  "id": "qp_txn_018f4b...",
  "estado": "LIQUIDADA",
  "referencia_banco": "55512345",
  "endtoend": "0000009876543210",
  "motivo_rechazo": null,
  "intentos": 1
}

Ciclo de vida de los estados

EstadoSignificado¿Final?
ACEPTADAEl banco recibió y aprobó (síncrono o "enviada a BCV")No (espera liquidación)
PENDIENTEAceptada, en liquidación interbancaria; consulta o espera webhookNo
LIQUIDADAConfirmada y liquidadaSí (OK)
RECHAZADARechazo de negocio (ver motivo_rechazo)Sí (fallo)
ERRORFallo técnico interno (reintentable)No
DESCONOCIDASin respuesta / timeout post-envíoNo

El camino feliz típico es ACEPTADA → LIQUIDADA.

Regla de seguridad. Ante DESCONOCIDA, consulta antes de reintegrar: el banco pudo haber movido el dinero. Nunca reenvíes la operación original a ciegas (por eso existe idempotency_key: reintentar la misma operación es seguro y no duplica).

No necesitas hacer polling agresivo: configura un webhook (siguiente sección) y QuickPay te avisa cuando el estado cambie.


5. Webhooks salientes

Las operaciones de la API directa también avisan por webhook (transaccion.aprobada, transaccion.rechazada, transaccion.liquidada). transaccion.aprobada llega cuando el banco confirma la operación (LIQUIDADA), junto con transaccion.liquidada; un cobro ACEPTADA (enviado a BCV, sin confirmar) no avisa nada todavía. Cómo registrarlo, verificar la firma v2 y manejar los reintentos: → Webhooks.

6. Manejo de errores y rechazos

Distingue dos planos:

6.1 Errores de protocolo (código HTTP)

HTTPSignificadoQué hacer
400Validación del cuerpo. Devuelve { "error": "VALIDATION", "detail": {...} } con los campos inválidosCorrige el payload
401x-switch-key ausente o inválidaRevisa formato <comercio>:<api_key> y que la llave esté activa
404id no encontrado (en /consultar), o la operación es de otro modo que tu llave: una llave de prueba no ve operaciones reales y una real no ve las de pruebaVerifica el id, el comercio y el modo de la llave
200El banco respondióLee estado del cuerpo para saber qué pasó con el dinero

6.2 Rechazos de negocio (motivo_rechazo)

Cuando estado es RECHAZADA, el campo motivo_rechazo te dice por qué, con un enum normalizado igual para todos los bancos.

json
{
  "id": "qp_txn_018f5c...",
  "estado": "RECHAZADA",
  "referencia_banco": null,
  "motivo_rechazo": "SALDO_INSUFICIENTE",
  "intentos": 1
}

Valores de motivo_rechazo y cómo reaccionar:

motivo_rechazoQué pasóAcción sugerida
SALDO_INSUFICIENTEEl pagador/ordenante no tiene fondosAvisa y reintenta luego
OTP_INVALIDOOTP vencido o incorrectoPide token nuevo (/cobrar/token) y reintenta
CUENTA_NO_EXISTECuenta destino/origen inexistenteCorrige el instrumento
CUENTA_BLOQUEADACuenta bloqueadaNo reintentable; contacta al titular
CUENTA_NO_DEBITO / CUENTA_NO_CREDITOLa cuenta no admite débito/créditoUsa otro instrumento
MONTO_INVALIDOMonto fuera de rango/formatoCorrige el monto
EXCEDE_LIMITESupera un tope (banco o riesgo)Reduce monto o revisa límites
BENEFICIARIO_NO_COINCIDENombre/ID no coincide con la cuentaVerifica datos del destino
NO_AFILIADO_SERVICIONo afiliado al servicio de pagoEl titular debe afiliarse
BANCO_NO_DISPONIBLEBanco caído o no procesóReintenta más tarde (QuickPay puede reenrutar en pagar)
DUPLICADAOperación ya procesadaConsulta el estado de la original
FUERA_DE_HORARIOFuera de ventana operativaReintenta en horario
CANCELADA_POR_PAGADOREl pagador cancelóNo reintentable
PENDIENTE_BCVEn liquidación BCVConsulta más tarde
RECHAZO_TECNICOFallo técnico del bancoReintentable con backoff
FIRMA_AUTHCredencial/config del bancoNo reintentable; reportar (no reenrutar dinero)
NO_SOPORTADOOperación no soportada (p. ej. reverso)Maneja por flujo alterno
BLOQUEO_RIESGOBloqueado por el motor de riesgo/fraudeRevisa listas/velocidad; no reintentar a ciegas
SIN_DEBITO_EN_EXTRACTOSólo en pagar: el banco no respondió al envío y, horas después, el débito no aparece en el estado de cuenta de QuickPayNo reenvíes con otra idempotency_key sin revisarlo antes con QuickPay
DESCONOCIDOSin clasificarConsulta el estado y, si sigue sin aclararse, escríbenos con el id

Reintentos seguros. Para reintentar una operación, usa el mismo idempotency_key: si la original sí se ejecutó, recibes su resultado en vez de un cobro/pago duplicado. Ante DESCONOCIDA o un timeout, consulta primero — nunca reenvíes con una llave nueva.


Recapitulando

¿Listo para producción? Cambia tu sk_test_… por sk_live_… — nada más en tu código cambia.

Documentación interactiva: {{base_url}}/docs (Scalar) · OpenAPI: {{base_url}}/openapi.json

Referencia

Entornos y URLs

URLs

APIhttps://pay.pagaconquickpay.com/switch/v1
Página de pago de un cobrohttps://pay.pagaconquickpay.com/l/<id>
Referencia completa (OpenAPI)docs.pagaconquickpay.com/docs · openapi.json

Prueba y producción usan las mismas URLs: el modo lo decide la llave (sk_test_ o sk_live_). → Llaves y entornos

Endpoints para comercios

Todos con x-switch-key: <tu-comercio>:<llave>.

MétodoRutaPara
POST/linksCrear un enlace de pago
GET/linksListar tus enlaces
GET/links/:idConsultar un enlace
POST/links/:id/cancelarCancelar un enlace que sigue pendiente
POST/links/:id/simularForzar el resultado de un enlace de prueba (pagado, rechazado o expirado); sólo con llave sk_test_
POST/lotesCrear hasta 500 enlaces
GET/lotesListar tus lotes
GET/lotes/:idConsultar un lote y cada enlace
POST/lotes/:id/cancelarCancelar los enlaces pendientes de un lote
GET · POST/webhooksListar o registrar webhooks
GET · PATCH · DELETE/webhooks/:idVer, cambiar (url, eventos, estado) o borrar un webhook
GET/webhooks/:id/deliveriesÚltimas entregas de un webhook
GET · POST/api-keysListar o crear llaves
POST/api-keys/:id/revokeRevocar una llave

Las llaves y los webhooks también se manejan desde el portal, en Integraciones.

Endpoint público (sin llave)

MétodoRutaPara
GET/verificar/:codigoComprobar que un comprobante es auténtico a partir de su código de verificación (QP-XXXXX-XXXXX). Límite: 20 consultas por minuto por IP. → Verificar un comprobante

Límites y reglas

QuéLímite
Peticiones a la API120 por minuto por comercio (al pasarlo: 429)
Ítems por lote500
Vigencia de un enlaceDe 1 hora a 30 días (expira_horas 1–720); por omisión 24 horas
concepto140 caracteres
metadataHasta 20 claves; nombre de hasta 40 caracteres y valor de hasta 200
idempotency_keyHasta 64 caracteres
success_url y failure_urlDeben empezar con https://; hasta 400 caracteres
Pago de prueba en procesando (clave 22222222)Pasa a pagado a los 30 segundos más o menos
MonedaBolívares (VES). Si cobras en dólares desde el portal, se convierte a la tasa BCV del momento
WebhooksURL https://; hasta 6 intentos de entrega
Pedir la clave de pago en la página de pago5 por hora por cobro. En producción, además, con la misma cédula y el mismo teléfono: 3 cada 10 minutos y una por minuto, y 10 cada 10 minutos desde una misma conexión (IP). Las solicitudes que el banco rechaza (por ejemplo, una cédula mal escrita) no cuentan. Al pasarlo, tu cliente ve cuánto debe esperar
Cierre diario de los bancosDe 11:45 p. m. a 1:30 a. m. (hora de Venezuela) no se puede pedir la clave de pago; aviso previo desde las 11:30 p. m. → Cierre diario
Monto por cobro y por díaTu cuenta puede tener un monto mínimo y uno máximo por cobro, y un máximo por día. Los fija QuickPay; si no tienes, no hay. Pueden estar en bolívares o en dólares: si están en dólares, se convierten a bolívares con la tasa oficial del BCV en el momento de cada operación. Un cobro que pasa el máximo se rechaza con EXCEDE_LIMITE (por debajo del mínimo, MONTO_INVALIDO) sin debitar a tu cliente. Si necesitas más, escríbenos
Tope de lo que recibesTu cuenta puede tener un tope por día (hora de Venezuela) y otro en total. Los fija QuickPay; si no tienes, no hay tope. Pueden estar en bolívares o en dólares: si están en dólares, se convierten a bolívares con la tasa oficial del BCV en el momento de cada cobro (así el tope no pierde valor cuando sube el dólar). Cuentan los cobros pagados y los que el banco está procesando; los rechazados no. Con el tope lleno, tu cliente no puede pedir la clave de pago (409 tope_diario_excedido o tope_acumulado_excedido, con el mensaje en motivo; con tu llave, POST /cobrar/token trae además tope y usado en Bs y, si tu tope está en dólares, topes_moneda, tope_usd y tasa_bcv); quien ya la tenía termina su pago. Las cuentas nuevas que se aprueban automáticamente, sin revisión previa, nacen con un tope de US$ 300 por día y US$ 1.000 en total hasta que QuickPay las revisa. Si necesitas más, escríbenos
PropinaHasta el tope que elijas (máximo el 100 % del cobro) y nunca más de Bs 100.000; dos decimales; sólo en bolívares → Propinas

Reglas que no cambian

Glosario de campos

Enlace de pago

CampoTipoQué es
idtexto (UUID)Identificador del cobro. Guárdalo junto a tu pedido
urltextoDónde paga tu cliente
wa_deeplinktexto o nullReservado para abrir el cobro en el WhatsApp de QuickPay. Hoy llega en null: para mandarle el cobro a tu cliente usa url
qr_pngtexto o nullQR de wa_deeplink (imagen PNG en data: URL). Hoy llega en null
comerciotextoEl código de tu comercio
montonúmeroMonto en bolívares que pide el cobro. No cambia aunque tu cliente agregue propina
propinanúmeroPropina que agregó tu cliente al pagar, en bolívares (0 si no agregó). Sólo aparece si activaste propinas en el portal → Propinas
totalnúmeroLo que se le debitó a tu cliente: monto + propina. Sin propina es igual a monto
monedatextoVES
conceptotextoLo que ve tu cliente al pagar
estadotextopendiente, cobrando, procesando, revision, pagado, expirado o cancelado → Estados
expires_atfecha (ISO, UTC)Cuándo vence
paid_atfecha (ISO, UTC)Cuándo se pagó
txn_idtextoId de la transacción del pago
created_atfecha (ISO, UTC)Cuándo se creó
metadataobjetoTus datos (al crear)
success_urltextoA dónde vuelve el cliente (al crear)
failure_urltextoA dónde vuelve el cliente si el pago no puede continuar: el cobro venció, lo cancelaste o él elige "Cancelar y volver" tras un rechazo (al crear). → Volver a tu web
idempotency_keytextoTu llave para no duplicar (al crear)
modetextotest o live: el ambiente del cobro. Viene en la respuesta de crear y dentro de data en los avisos link.pagado y link.acreditado
codigo_verificaciontextoCódigo del comprobante (QP-XXXXX-XXXXX) de un cobro pagado. Quien lo reciba puede comprobar en pagaconquickpay.com/verificar que el comprobante es auténtico. Viene al consultar o listar un enlace pagado (null en los demás estados) y dentro de data en el aviso link.pagado. Es null si por ahora no se pudo generar
pagadorobjetoLo que sabemos de quien pagó. Hoy trae sólo alta_cliente
alta_clientesí/noDentro de pagador. true si quien paga marcó en la página de pago "Quiero ser cliente de tu comercio y recibir sus novedades" (la casilla viene desmarcada). Con el cobro pagado, esa persona aparece en Clientes del portal → Página de pago. No trae su cédula, teléfono ni nombre
idempotent_replaysí/notrue cuando repetiste la creación con la misma idempotency_key y te devolvemos el enlace que ya existía
splitlistaSólo en enlaces con pago dividido (piloto): las reglas del reparto que mandaste al crearlo. Viene al crear y al consultar el enlace
repartoobjeto o nullSólo en enlaces con pago dividido: al consultar el enlace, null hasta que el pago se liquida y después lo que se llevó cada cuenta (estado: pendiente, repartido, en_revision o cerrado; monto_comercio, monto_repartido, beneficiarios). También dentro de data en el aviso link.acreditado → Pago dividido

Respuesta de POST /links/:id/simular (sólo cobros de prueba)

CampoQué es
idEl id del cobro
estadoEstado en que queda el cobro: pagado, pendiente o expirado
resultadoLo que pediste simular: pagado, rechazado o expirado
simuladoSiempre true

Respuesta de POST /links/:id/cancelar

CampoQué es
idEl id del cobro
estadocancelado

Aviso link.pagado (campo data)

CampoQué es
link_idEl id del cobro
txn_idId de la transacción
estadopagado
monto, moneda, conceptoDel cobro (monto es el del enlace, sin propina)
propinaPropina que agregó tu cliente (0 si no agregó)
totalLo debitado: monto + propina
referenciaReferencia del banco (SIMULADO en un cobro de prueba)
modelive o test: si el pago fue de producción o simulado
codigo_verificacionCódigo del comprobante, para que tu cliente (o tú) lo verifique en pagaconquickpay.com/verificar
pagador{ "alta_cliente": true } si quien pagó pidió ser tu cliente y recibir tus novedades; false si no
metodoSólo viene si tu cliente pagó con tarjeta (piloto): "tarjeta". Sin este campo, el pago fue con débito inmediato → Pagar con tarjeta
recargo_tarjetaSólo con metodo: "tarjeta": recargo por pago con tarjeta que pagó tu cliente además del total. No es tuyo ni se te liquida

Aviso link.acreditado (campo data)

CampoQué es
link_idEl id del cobro
txn_idId del pago del cliente
liquidacion_txn_idId de la transferencia a tu cuenta
monto_brutoLo que pagó tu cliente (con la propina, si agregó una)
comisionComisión descontada
monto_acreditadoLo que llegó a tu cuenta
estadoacreditado
monedaVES
referencia_bancariaReferencia del banco de la transferencia a tu cuenta
banco_destinoCódigo del banco de tu cuenta
referencia_cobroReferencia del banco del pago de tu cliente
modelive o test: si la acreditación fue real o simulada
repartoSólo con pago dividido: lo que se llevó cada cuenta. En ese caso monto_acreditado es sólo tu parte

Aviso link.devuelto (campo data, piloto)

CampoQué es
link_idEl id del cobro que se devolvió
devolucion_idId de la devolución (un cobro puede tener varias devoluciones parciales)
estadocompletada: el dinero salió hacia tu cliente
montoLo que se le devolvió a tu cliente en esta devolución
monto_devueltoLo devuelto en total de ese cobro, contando las devoluciones anteriores
monedaVES
referencia_bancariaReferencia del banco de la transferencia a tu cliente. Puede venir null
modelive o test: si la devolución fue real o simulada

Avisos transaccion.* (campo data)

CampoQué es
idEl id de la operación
estadoLIQUIDADA o RECHAZADA (con una llave de prueba, ACEPTADA)
monto, moneda, conceptoDe la operación
referenciaReferencia del banco
operacionDe qué es: cobro, pago, reverso, devolucion_debito, devolucion o devolucion_retorno → Webhooks

Novedades

16 de octubre de 2026

14 de octubre de 2026

13 de octubre de 2026

12 de octubre de 2026

11 de octubre de 2026

10 de octubre de 2026 (segunda auditoría de seguridad)

10 de octubre de 2026 (operaciones sobre una transacción)

10 de octubre de 2026 (seguridad)

10 de octubre de 2026 (seguridad de llaves y webhooks)

10 de octubre de 2026 (prueba y producción separadas)

9 de octubre de 2026 (conciliación de pagos entrantes)

9 de octubre de 2026 (cuentas demo)

9 de octubre de 2026 (Clientes y Suscripciones a escala)

9 de octubre de 2026 (cuentas personales)

9 de octubre de 2026 (comisión general)

9 de octubre de 2026 (revisión de QA)

9 de octubre de 2026 (planes de WhatsApp)

9 de octubre de 2026 (noche, propinas en euros)

9 de octubre de 2026 (tarde)

9 de octubre de 2026 (mediodía)

9 de octubre de 2026

9 de octubre de 2026 (mañana)

9 de octubre de 2026 (madrugada)

9 de octubre de 2026 (noche)

9 de octubre de 2026 (tarde)

9 de octubre de 2026 (mañana)

8 de octubre de 2026 (noche)

8 de octubre de 2026 (tarde)

8 de octubre de 2026 (mañana)

16 de septiembre de 2026

6 de septiembre de 2026

IA y MCP

Conecta QuickPay a tu IA (MCP)

Con el servidor MCP de QuickPay, tu asistente de IA (Claude, ChatGPT, Claude Code, Cursor u otro compatible con MCP) crea y consulta tus enlaces de cobro cuando se lo pides con tus palabras: "Cobra Bs 1.500 por el pedido 1024", "¿Qué cobros tengo pendientes?".

No copias ninguna llave: pegas la dirección del servidor, entras con el correo de tu comercio y autorizas.

text
https://mcp.pagaconquickpay.com/mcp

Para leerlo o compartirlo: Guía esencial del MCP en PDF.

Qué puede hacer tu IA

Casi todo lo de la API pública: lo que no puede está en la sección siguiente.

HerramientaQué hacePruebaProducción
crear_link_cobroCrea un enlace de cobro con monto y concepto (opcional: moneda, expira_horas, expira_en, idempotency_key, success_url, metadata). Crearlo no mueve dinero: el cobro ocurre sólo si alguien lo paga.SíSí
listar_cobrosLista tus enlaces, los más recientes primero (20 por omisión, hasta 50 por página). Filtra por estado, fechas, montos o texto (concepto, nombre de quien pagó, referencia bancaria o id).SíSí
ver_cobroMuestra un enlace por su id: monto, estado, cuándo se pagó y el código del comprobante.SíSí
cancelar_linkCancela un enlace que sigue pendiente. Uno pagado o en proceso de pago no se cancela.SíSí
simular_cobroFuerza el resultado de un enlace de prueba (pagado, rechazado o expirado). → Modo pruebaSíNo
crear_loteCrea hasta 500 enlaces de una vez. → Cobro por loteSíSí
listar_lotes · ver_loteTus lotes con su resumen, o uno con el estado de cada enlace.SíSí
cancelar_loteCancela los enlaces de un lote que siguen pendientes.SíSí
verificar_comprobanteComprueba un comprobante por su código QP-XXXXX-XXXXX.SíSí
consultar_estadoDice si un pago está confirmado, por el id de la transacción (el txn_id de un enlace pagado): LIQUIDADA, ACEPTADA (en proceso) o RECHAZADA.SíSí
listar_liquidacionesTus liquidaciones.SíSí
listar_bancosLos bancos desde los que tus clientes pueden pagarte (código y nombre).SíSí
mi_conexionCon qué comercio y en qué modo está conectada.SíSí
listar_llavesTus llaves de API, enmascaradas.SíSí
crear_llave · revocar_llaveCrea o revoca una llave de prueba (sk_test). La llave completa se muestra una sola vez. → Llaves y entornosSíNo: desde el portal
listar_webhooks · ver_webhook · ver_entregas_webhookTus webhooks (sin el secreto) y sus últimas entregas.SíSí

Webhooks: tu IA sólo los ve. Registrarlos, cambiarlos o borrarlos se hace desde el portal › Integraciones. → Webhooks

En producción, las llaves también sólo se ven: crearlas o revocarlas se hace desde el portal › Integraciones. Si se lo pides a tu IA, QuickPay responde 403 solo_desde_el_portal y tu IA te lo dice.

Las herramientas que cambian algo (cancelar, simular, llaves) van marcadas para que tu IA te pida confirmación antes de usarlas.

Qué no puede hacer

Tu IA no puede enviar, pagar, transferir ni devolver dinero, ni sacar dinero de ninguna cuenta. Tampoco puede ver tus movimientos o tu saldo, cambiar tus datos o tu cuenta bancaria, registrar o cambiar webhooks, ni, en producción, crear o revocar llaves (eso se hace en el portal). Esas herramientas no existen en el servidor MCP y, además, QuickPay rechaza (403) cualquier otra operación hecha con el acceso de una IA, aunque alguien intente usarlo fuera del MCP.

Cómo se conecta

  1. Agregas QuickPay en tu IA con la dirección de arriba (los pasos de cada una están más abajo).
  2. Tu IA abre una página de QuickPay en el navegador. Escribe el correo de tu comercio, el mismo con el que entras al portal, y te llega un enlace de acceso.
  3. Abre el enlace en el mismo navegador donde empezaste. Expira en 15 minutos y es de un solo uso.
  4. Revisa qué podrá hacer la IA, elige el comercio (si tienes varios) y el modo, y toca Autorizar.

Modo prueba o producción

ModoQué pasa
Prueba (por omisión)Los enlaces son de prueba: nadie paga dinero real. Igual que con tu llave sk_test. → Modo prueba
ProducciónLos enlaces cobran dinero real a quien los pague. Llaves y webhooks sólo se ven (se manejan desde el portal). Sólo se puede elegir si tu cuenta ya está aprobada y la aplicación es conocida (Claude, ChatGPT, Cursor o una de línea de comandos como Claude Code).

Si la página dice Aplicación no verificada, la aplicación que pidió el acceso no vuelve a una de las conocidas: sólo se puede conectar en modo prueba. Autoriza sólo si reconoces la dirección que aparece en "Volverá a".

Para cambiar de modo, quita el conector y vuelve a conectarlo eligiendo el otro.

Claude

En Claude (web o escritorio), agrega un conector personalizado con la dirección https://mcp.pagaconquickpay.com/mcp, ponle de nombre QuickPay y conéctalo: se abre la página de QuickPay para entrar y autorizar.

ChatGPT

En la configuración de ChatGPT, en Conectores, crea un conector con la dirección https://mcp.pagaconquickpay.com/mcp y autenticación OAuth. Al conectarlo se abre la página de QuickPay para entrar y autorizar. Los conectores personalizados dependen de tu plan de ChatGPT.

Claude Code

bash
claude mcp add --transport http quickpay https://mcp.pagaconquickpay.com/mcp

Luego, dentro de Claude Code, escribe /mcp, elige quickpay y autentícate: se abre el navegador para entrar y autorizar.

Cursor

Agrega esto a ~/.cursor/mcp.json (si ya tienes otros servidores, suma sólo quickpay dentro de mcpServers):

json
{
  "mcpServers": {
    "quickpay": { "url": "https://mcp.pagaconquickpay.com/mcp" }
  }
}

Cuando Cursor lo pida, entra y autoriza en el navegador.

Ejemplos

Lo que le pides a tu IA y lo que hace. Tu IA redacta la respuesta a su manera; los datos salen de QuickPay.

Le dicesUsaTe responde
"Cobra Bs 1.500 por el pedido 1024"crear_link_cobroEl enlace (https://pay.pagaconquickpay.com/l/…) para mandárselo a tu cliente, con el monto, el concepto y hasta cuándo vale (24 horas si no le dices otra cosa).
"¿Qué cobros tengo pendientes?"listar_cobrosTus enlaces pendientes, del más reciente al más viejo, con monto y concepto.
"¿Ya pagaron el pedido 1024?"listar_cobros / ver_cobroBusca el enlace por el concepto y te dice su estado: pendiente, procesando, pagado, expirado o cancelado; si está pagado, cuándo.
"Cancela el enlace del pedido 1024"cancelar_linkQue quedó cancelado y ya no se puede pagar. Si alguien ya lo pagó o lo está pagando, te dice que no se puede.
"¿Con qué bancos me pueden pagar?"listar_bancosLa lista de bancos desde los que tus clientes pueden pagarte.
"¿Qué liquidaciones tengo?"listar_liquidacionesTus liquidaciones con su estado y monto.
"¿Estás en modo prueba?"mi_conexionTu comercio y si la conexión es de prueba o de producción.
"Crea un lote con estas 3 facturas: …"crear_loteEl lote con un enlace por factura.
"Simula que pagaron el enlace de prueba"simular_cobroQue el enlace de prueba quedó pagado (en producción no se puede).
"¿Qué webhooks tengo?"listar_webhooksTus webhooks con su URL, eventos y estado.
"Crea una llave de prueba para mi servidor"crear_llaveLa llave sk_test_… completa, una sola vez.
"¿Es auténtico el comprobante QP-…?"verificar_comprobanteSi es válido, con el monto y la fecha del pago.

Seguridad

Con tu llave, sin iniciar sesión

Si tu herramienta no soporta el inicio de sesión de MCP (OAuth), puedes mandar tu llave en un header. La IA tiene entonces el modo de la llave (sk_test = prueba, sk_live = producción) y las mismas herramientas de arriba.

bash
claude mcp add --transport http quickpay https://mcp.pagaconquickpay.com/mcp --header "x-switch-key: <comercio>:<tu_llave>"

Con este método la llave queda guardada en la configuración de tu herramienta. Usa la de prueba mientras pruebas y revócala en tu portal › Integraciones › Llaves de API si se expone. Con el inicio de sesión no hay llave que cuidar.

Detalles técnicos

Para quien construye su propio cliente MCP. El servidor sigue la especificación de autorización de MCP (2025-06-18):

Recurso protegido (RFC 9728)https://mcp.pagaconquickpay.com/.well-known/oauth-protected-resource
Servidor de autorización (RFC 8414)https://mcp.pagaconquickpay.com/.well-known/oauth-authorization-server
Registro de clientes (RFC 7591)POST /oauth/register
AutorizaciónGET /oauth/authorize: código de autorización con PKCE S256 obligatorio
TokensPOST /oauth/token: authorization_code y refresh_token
Revocación (RFC 7009)POST /oauth/revoke

Usar la documentación con tu IA o sin conexión

Si prefieres no navegar página por página, descarga toda la documentación en un solo archivo. Son las mismas guías de este sitio, en el mismo orden, y se actualizan con ellas.

ParaDescarga
Lo esencial, con índice, para leer o compartirGuía esencial en PDF (unas 30 páginas)
Toda la documentación juntaEn una sola página (se puede imprimir)
Dársela a Claude, ChatGPT, Cursor u otra IAquickpay-docs.md
Herramientas que leen el estándar llms.txthttps://docs.pagaconquickpay.com/llms.txt (índice) y https://docs.pagaconquickpay.com/llms-full.txt (todo el texto)

Cada guía tiene además su propio botón Descargar .md arriba a la derecha.

Cómo usarla con una IA

  1. Descarga quickpay-docs.md.
  2. Súbelo a la conversación (o a tu proyecto) y pídele lo que necesitas, por ejemplo: "Con esta documentación, escribe en Node el endpoint que recibe el webhook link.pagado y verifica la firma".
  3. Prueba lo que te entregue con tu llave de prueba sk_test_… antes de pasar a producción. → Modo prueba

Tu llave no va en la conversación. La IA no la necesita para escribir el código: déjala en tu servidor, en una variable de entorno. Si alguna vez la pegaste en un chat, revócala en tu portal › Integraciones › Llaves de API y crea otra.

La referencia técnica de cada endpoint (OpenAPI) está en Referencia de la API.