# PagoLink > PagoLink es la infraestructura de pagos de Venezuela (un producto de SOFTBIZ). Con una sola integración aceptas todos los métodos del país — Pago Móvil, C2P, Débito Inmediato, Transferencia, Binance Pay, Zelle y PayPal — sin construir cada conexión por separado. El dinero llega directo a la cuenta bancaria del comercio (PagoLink no custodia fondos). Empezamos en Venezuela, construido para escalar al mundo. Hay dos formas de usarlo: la **API / SDK** para desarrolladores (integrar pagos venezolanos en una app, web o checkout) y el **Terminal POS** para comercios (cobro en persona). El flujo es siempre el mismo: tu backend crea una **sesión**, tu frontend abre el **Checkout** (pago online) o el **Terminal POS** (cobro en persona) con el SDK, y recibes la confirmación por callback. Confirma siempre el estado final del lado del servidor. Docs completas: https://docs.pagolink.co ## Entornos y dominios | Servicio | QA (.dev) | Producción (.ai) | |---|---|---| | Consola | console.pagolink.co | console.pagolink.softbiz.ai | | Checkout | pay.pagolink.co | pay.pagolink.softbiz.ai | | Terminal POS | pos.pagolink.co | pos.pagolink.softbiz.ai | | API | api.pagolink.co | api.pagolink.co | | Docs | docs.pagolink.co | docs.pagolink.co | La API usa prefijos `/v1`, `/accounts/v1` y `/billing/v1`. Claves: `sk_…` (secreta, SOLO en tu servidor) y `pk_…` (publishable, segura para el frontend). ## 1 · Crear una sesión (backend) Con tu API key secreta, desde tu servidor: ``` POST https://api.pagolink.co/v1/checkout/sessions # mismo endpoint para Checkout y Terminal POS Headers: Content-Type: application/json, x-api-key: sk_live_… Body: { "amount": 1250.00, "currency": "VES" } => { "sessionId": "sess_…" } ``` Ejemplo: ```js const res = await fetch('https://api.pagolink.co/v1/checkout/sessions', { method: 'POST', headers: { 'Content-Type': 'application/json', 'x-api-key': 'sk_live_…' }, body: JSON.stringify({ amount: 1250.00, currency: 'VES' }), }); const { sessionId } = await res.json(); ``` El `sessionId` es de corta vida y acotado a una operación de cobro. Se pasa al SDK en el frontend. ### Tasa de cambio / conversión a VES (opcional) Si cobras en USD (o quieres mostrar el equivalente en bolívares), al crear la sesión puedes pasar la tasa y el Checkout muestra el monto convertido a VES y la línea "Tasa X Bs/USD": - `exchangeRate`: bolívares por unidad de la moneda base, como string (ej. `"40.5"` = 40,5 Bs por USD). - `amounts`: montos explícitos por moneda, ej. `{ "VES": 400 }` (tiene precedencia sobre `exchangeRate`). ``` POST https://api.pagolink.co/v1/checkout/sessions Body: { "amount": 10.00, "currency": "USD", "exchangeRate": "40.5" } // El comprador ve el equivalente en Bs y "Tasa 40,5 Bs/USD". ``` La tasa la define tu backend (no hay feed de tasa incorporado); pásala en cada sesión con el valor vigente al momento del cobro. ## 2 · Incluir el SDK (frontend) ```html ``` El global del SDK es `window.PagoLink`. ## 3 · Abrir el cobro ### charge() — modal Abre el cobro en una ventana modal sobre tu página (Checkout) o el terminal (POS): ```js pl.charge({ sessionId, onSuccess: (r) => console.log(r.status), // r = { sessionId, status } onCancel: () => console.log('cancelado'), onError: (e) => console.error(e.message), }); ``` ### mountCharge() — embebido Monta el cobro dentro de un contenedor propio (ideal para el POS embebido): ```js const handle = pl.mountCharge(document.querySelector('#pos-slot'), { sessionId, onSuccess: (r) => { /* … */ }, }); handle.destroy(); // para desmontar ``` ### mountButton() — botón de pago con la marca PagoLink Renderiza un botón de pago ya diseñado (logo de PagoLink + monocromo, sin dependencias) dentro de un contenedor. Al hacer clic abre el checkout (o el terminal POS con `mode: 'pos'`) con el mismo flujo y callbacks: ```js const handle = pl.mountButton('#pagar', { // selector o HTMLElement sessionId, label: 'Pagar con PagoLink', // opcional (default: "Pagar con PagoLink") mode: 'checkout', // 'checkout' (default) | 'pos' theme: 'dark', // 'dark' (default) | 'light' onSuccess: (r) => { /* … */ }, onCancel: () => { /* … */ }, onError: (e) => { /* … */ }, }); handle.destroy(); // para remover el botón ``` ## Callbacks | Callback | Payload | |---|---| | onSuccess | `{ sessionId, status }` | | onCancel | — (el usuario cerró el cobro) | | onError | `{ code, message }` | El callback del navegador es una señal de UX, no la fuente de verdad. Confirma el estado final en tu backend (webhook o consulta de la sesión). ## Apariencia (appearance) Personaliza el cobro con `appearance` (o el `branding` de la sesión): ```js pl.charge({ sessionId, appearance: { theme: 'dark', // 'light' | 'dark' | 'auto' colorPrimary: '#F5F5F6', colorSuccess: '#00E0C6', colorDanger: '#FF5C5C', borderRadius: '12px', fontFamily: 'Archivo, sans-serif', hideBranding: false, }, }); ``` ## Métodos de pago | Método | Qué pide | |---|---| | Pago Móvil | El cliente paga desde su banco; se verifica el pago entrante. | | C2P | Banco + teléfono + clave C2P del cliente. | | Débito Inmediato | OTP de 8 dígitos enviado por SMS al cliente. | | Transferencia | Datos de cobro; verificación del pago. | | Binance Pay | QR; el cliente escanea y paga en USDT. | ## Seguridad - La API key secreta (`sk_…`) vive solo en tu servidor. Nunca en el navegador. - El frontend solo usa el publishable key (`pk_…`) y el `sessionId` de corta vida. - El cobro corre en un iframe del origin de PagoLink; el SDK valida el `origin` del comercio en cada mensaje. - Confirma el estado final del lado del servidor antes de entregar el producto o servicio.