Documentación API v1.4.2
PagoVeloz › Documentación API
API operativa

Referencia de la API

La API de PagoVeloz sigue las convenciones REST. Acepta cuerpos de petición JSON, devuelve respuestas JSON y usa códigos de estado HTTP estándar. Base URL: https://api.pago-veloz.com/v1

Primeros pasos

Para comenzar a integrar la API de PagoVeloz necesitas una clave de API. Puedes generar tus claves desde el panel de control en Configuración → API Keys.

Utiliza las claves de entorno sandbox durante el desarrollo. Las claves de producción solo deben usarse en servidores seguros, nunca en código cliente.

Instalación del SDK

Node.js Python PHP
# npm
npm install @pagoveloz/node

# yarn
yarn add @pagoveloz/node

Primera petición

const PagoVeloz = require('@pagoveloz/node');

const pv = new PagoVeloz('pk_live_TU_CLAVE_AQUI');

const pago = await pv.pagos.crear({
  monto:    15000,
  moneda:   'CLP',
  metodo:   'tarjeta',
  cliente:  'cli_abc123',
  metadata: { pedido_id: 'ord_9821' }
});

console.log(pago.id); // pay_xK8mN2qP...

Autenticación

La API usa claves de API tipo Bearer. Incluye tu clave en el header Authorization de cada petición.

Bearer Token

Prefija tu clave con Bearer. Las claves de producción empiezan con pk_live_ y las de sandbox con pk_test_.

Authorization: Bearer pk_live_xK8mN2qP4rT7vW1yZ3aB6cD
Las claves de producción tienen acceso completo. Nunca las expongas en código frontend, repositorios públicos ni variables de entorno no cifradas.

Errores y códigos de estado

PagoVeloz utiliza los códigos de estado HTTP estándar. Los errores devuelven un objeto JSON con el detalle.

CódigoSignificadoDescripción
200OKPetición exitosa.
201CreatedRecurso creado correctamente.
400Bad RequestParámetros inválidos o faltantes.
401UnauthorizedClave de API inválida o expirada.
402Payment RequiredEl pago fue rechazado por el emisor.
422UnprocessableError de validación de negocio.
429Too Many RequestsLímite de peticiones superado.
500Server ErrorError interno. Reintenta con backoff.

Estructura de error

{
  "error": {
    "codigo":   "tarjeta_rechazada",
    "mensaje":  "La tarjeta fue declinada por el banco emisor.",
    "campo":    null,
    "doc_url":  "https://docs.pago-veloz.com/errores/tarjeta_rechazada",
    "request_id": "req_7mKpN2xQ"
  }
}

Rate limiting

Los límites se aplican por clave de API. La respuesta incluye headers informativos en cada petición.

HeaderDescripción
X-RateLimit-LimitPeticiones permitidas por ventana (1 minuto).
X-RateLimit-RemainingPeticiones disponibles en la ventana actual.
X-RateLimit-ResetUnix timestamp de reset de la ventana.

El límite por defecto es 300 peticiones/minuto para producción y 60/minuto para sandbox. Contacta a soporte para aumentar los límites.

Entornos

EntornoBase URLPrefijo clave
Producciónhttps://api.pago-veloz.com/v1pk_live_
Sandboxhttps://sandbox.pago-veloz.com/v1pk_test_
En sandbox puedes simular distintos escenarios usando números de tarjeta de prueba. Consulta la guía de testing para la lista completa.

Pagos

POST /v1/pagos Crear un nuevo pago

Crea un nuevo objeto de pago. Puede quedar en estado pendiente, procesando o aprobado dependiendo del flujo de autenticación.

Parámetros del cuerpo

ParámetroTipoRequeridoDescripción
montointegerrequeridoMonto en centavos o unidad mínima de la moneda. Para CLP usar pesos enteros.
monedastringrequeridoCódigo ISO 4217. Ej: CLP, USD, MXN.
metodostringrequeridotarjeta, transferencia, wallet.
clientestringopcionalID de cliente existente (cli_...). Requerido para pagos recurrentes.
descripcionstringopcionalDescripción visible en el estado de cuenta del cliente. Máx. 255 caracteres.
captura_automaticabooleanopcionalSi false, el pago queda preautorizado hasta captura manual. Default: true.
metadataobjectopcionalPares clave-valor libres. Máx. 20 claves, 500 bytes por valor.

Ejemplo de petición

curl -X POST https://api.pago-veloz.com/v1/pagos \
  -H "Authorization: Bearer pk_live_xK8mN2..." \
  -H "Content-Type: application/json" \
  -d '{
    "monto":             25990,
    "moneda":            "CLP",
    "metodo":            "tarjeta",
    "cliente":           "cli_abc123",
    "descripcion":       "Suscripción mensual Plan Pro",
    "captura_automatica": true,
    "metadata": {
      "pedido_id": "ord_9821",
      "canal":     "web"
    }
  }'

Respuesta

201 Created
{
  "id":                 "pay_xK8mN2qP4rT7vW",
  "objeto":             "pago",
  "monto":              25990,
  "moneda":             "CLP",
  "estado":             "aprobado",
  "metodo":             "tarjeta",
  "cliente":            "cli_abc123",
  "descripcion":        "Suscripción mensual Plan Pro",
  "capturado":          true,
  "codigo_autorizacion":"AUT-441829",
  "creado_en":          1702915200,
  "metadata": {
    "pedido_id": "ord_9821",
    "canal":     "web"
  }
}
GET /v1/pagos/:id Obtener un pago por ID
GET /v1/pagos Listar pagos con filtros
POST /v1/pagos/:id/capturar Capturar pago preautorizado
DEL /v1/pagos/:id Cancelar pago pendiente

Reembolsos

POST /v1/pagos/:id/reembolsos Crear reembolso total o parcial
GET /v1/pagos/:id/reembolsos/:reembolso_id Obtener reembolso

Clientes

POST /v1/clientes Crear cliente
PUT /v1/clientes/:id Actualizar cliente
GET /v1/clientes/:id Obtener cliente

Webhooks

Los webhooks notifican a tu servidor cuando ocurre un evento en PagoVeloz. Regístralos desde el panel en Configuración → Webhooks.

Eventos disponibles

EventoDescripción
pago.aprobadoEl pago fue autorizado y capturado exitosamente.
pago.rechazadoEl emisor rechazó la transacción.
pago.reembolsadoSe procesó un reembolso total o parcial.
pago.disputa.abiertaEl titular abrió una disputa (chargeback).
pago.disputa.resueltaLa disputa fue resuelta por el banco.
cliente.creadoNuevo cliente registrado en la plataforma.

Verificar la firma

Cada webhook incluye el header X-PagoVeloz-Signature con un HMAC-SHA256 del cuerpo firmado con tu secreto de webhook.

const crypto = require('crypto');

function verificarFirma(payload, header, secreto) {
  const firma = crypto
    .createHmac('sha256', secreto)
    .update(payload, 'utf8')
    .digest('hex');

  return crypto.timingSafeEqual(
    Buffer.from(firma),
    Buffer.from(header)
  );
}
Usa siempre timingSafeEqual para comparar las firmas. La comparación directa de strings es vulnerable a ataques de timing.