UNIpagos Infrastructure API · v1

Documentación técnica

Una sola API para emitir cuentas, resolver identidad, emitir tarjetas, mover dinero, convertir monedas y prestar. Base https://unipagos.com.ar/api/baas/v1.

Inicio rápido

Del alta del programa al primer usuario con saldo

Paso 1 · fondear el float

El float respalda todo lo que emitís

curl -X POST https://unipagos.com.ar/api/baas/v1/float/fund \
  -H "Authorization: Bearer sk_baas_test_…" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: float-001" \
  -d '{"amount": 10000, "currency": "USD"}'

Paso 2 · crear el usuario final

Persona o empresa, con su identidad

curl -X POST https://unipagos.com.ar/api/baas/v1/users \
  -H "Authorization: Bearer sk_baas_test_…" \
  -H "Content-Type: application/json" \
  -d '{
    "kind": "person",
    "name": "Ana Gómez",
    "email": "ana@example.com",
    "tax_id": "20345678901",
    "country": "AR",
    "external_id": "user-4821"
  }'
{
  "data": {
    "id": "e69e2a7d-a0c5-4973-98f2-aa421683d1ec",
    "external_id": "user-4821",
    "name": "Ana Gómez",
    "kyc_status": "pending",
    "kyc_level": 0,
    "limit": 250,
    "status": "active"
  }
}

Paso 3 · abrir la cuenta y acreditar

Cuenta con número, alias y saldo

curl -X POST https://unipagos.com.ar/api/baas/v1/accounts \
  -H "Authorization: Bearer sk_baas_test_…" \
  -H "Content-Type: application/json" \
  -d '{"end_user": "user-4821", "currency": "ARS", "kind": "payment"}'

curl -X POST https://unipagos.com.ar/api/baas/v1/transfers \
  -H "Authorization: Bearer sk_baas_test_…" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: top-up-001" \
  -d '{"from": "float", "to": "2876263442317436075686", "amount": 5000}'

Autenticación

Toda ruta privada pide el header Bearer con tu secret. El prefijo indica el modo: sk_baas_test_ opera en sandbox y sk_baas_live_ en producción, con el mismo código.

Authorization: Bearer sk_baas_live_…
Content-Type: application/json
Idempotency-Key: transfer-1042

Nunca uses el secret en el frontend. El panel muestra el secret una sola vez al crear la clave.

Permisos por clave

Cada clave lleva sus propios permisos. Si falta uno, la respuesta es 403 con insufficient_scope.

PermisoAlcance
usersUsuarios finales e identidad
accountsCuentas, saldos y extracto
cardsProgramas, tarjetas y autorizaciones
transfersTransferencias y órdenes de pago
paymentsIntenciones de cobro y checkout
fxCotizaciones, conversión y cross-border
creditLíneas, préstamos y cuotas
webhooksSuscripción a eventos
reportsBalances, comisiones y liquidaciones

Convenciones

  • Toda respuesta exitosa devuelve el recurso dentro de data.
  • Los POST aceptan Idempotency-Key: un reintento devuelve la misma respuesta con el header Idempotent-Replay.
  • Los listados aceptan limit (1 a 200) y offset.
  • Cada respuesta incluye X-Request-Id para soporte.
  • Los montos son decimales con dos posiciones; la moneda va en formato ISO de tres letras.
  • Podés identificar usuarios y cuentas por su id, su uuid o tu propio external_id.

Errores

El campo error identifica el caso y message explica qué corregir.

HTTPerrorCuándo ocurre
401unauthorizedFalta la clave o no es válida
403insufficient_scopeLa clave no tiene el permiso pedido
403product_not_enabledEl producto no está habilitado en tu programa
403live_not_enabledTodavía no aprobamos producción
403partner_suspendedEl programa está suspendido
404not_foundRuta o recurso inexistente
422invalid_requestDatos, saldo o límites inválidos
429rate_limitedSuperaste las solicitudes por minuto del plan
500internal_errorFalla inesperada: guardá el request_id

Identidad y límites

Enviás los controles que hiciste sobre el usuario final y la API resuelve su nivel y su tope operativo. El tope se aplica en cada movimiento, sin que tengas que validarlo vos.

Niveles

NivelRequisitosTope por operación
Nivel 0 · declaradoDatos declarados sin verificarUS$ 250,00
Nivel 1 · documentoDocumento de identidad validadoUS$ 2.500,00
Nivel 2 · prueba de vidaDocumento + prueba de vida + fiscalUS$ 25.000,00
Nivel 3 · reforzadoDomicilio, listas restrictivas y origen de fondosUS$ 250.000,00

Enviar controles

curl -X POST https://unipagos.com.ar/api/baas/v1/users/user-4821/kyc \
  -H "Authorization: Bearer sk_baas_test_…" \
  -H "Content-Type: application/json" \
  -d '{
    "checks": [
      {"type": "document", "result": "passed", "score": 95},
      {"type": "liveness", "result": "passed", "score": 92},
      {"type": "tax", "result": "passed"},
      {"type": "sanctions", "result": "passed"}
    ]
  }'

Tipos aceptados: document, liveness, address, tax, company, pep y sanctions. Al completar los controles del nivel, emitimos user.kyc.updated.

Cuentas, libro y transferencias

Tipos de cuenta

payment
Cuenta de pago del usuario final: recibe, envía y opera con tarjeta.
savings
Cuenta separada para apartar fondos del mismo usuario.
collect
Cuenta de recaudación para cobros con conciliación por referencia.
float
Cuenta del programa que respalda todo lo emitido. Una por moneda.

Monedas disponibles: USD y las locales de cada país (ARS, BRL, MXN, COP, CLP, PEN, UYU, PYG).

Transferir

curl -X POST https://unipagos.com.ar/api/baas/v1/transfers \
  -H "Authorization: Bearer sk_baas_live_…" \
  -H "Idempotency-Key: pay-9931" \
  -d '{
    "from": "2876263442317436075686",
    "to": "ana.pagos.uni",
    "amount": 1250.50,
    "description": "Pago de servicio"
  }'

Origen y destino aceptan número de cuenta, alias o la palabra float. La comisión de tu plan se descuenta y se registra por separado.

GET /accounts/{id}/ledger · privado

Extracto con doble entrada

{
  "data": [
    {
      "id": "…",
      "group": "…",
      "direction": "credit",
      "type": "transfer_in",
      "amount": 5000.00,
      "currency": "ARS",
      "balance_after": 5000.00,
      "description": "Transferencia recibida",
      "reference": "BXE0C327C784",
      "created_at": "2026-08-14 01:10:22"
    }
  ]
}

POST /payment-intents · privado

Cobrar con checkout

Creás la intención sobre la cuenta que recibe el dinero y le pasás checkout_url a quien tiene que pagar. Cuando se acredita, emitimos payment.paid con tu external_id.

curl -X POST https://unipagos.com.ar/api/baas/v1/payment-intents \
  -H "Authorization: Bearer sk_baas_live_…" \
  -H "Idempotency-Key: order-8891" \
  -d '{
    "account": "2876263442317436075686",
    "amount": 4500,
    "description": "Orden 8891",
    "external_id": "order-8891",
    "expires_in": 86400
  }'

En sandbox, checkout_url abre una pantalla de prueba donde podés aprobar el pago a mano, o lo simulás por API con POST /payment-intents/{id}/pay. En producción el enlace es el checkout UNIpagos con saldo, tarjeta, cuotas y efectivo.

Emisión y autorizaciones

Emitir una tarjeta

curl -X POST https://unipagos.com.ar/api/baas/v1/cards \
  -H "Authorization: Bearer sk_baas_live_…" \
  -H "Idempotency-Key: card-4821" \
  -d '{
    "program": "UPBDC220",
    "end_user": "user-4821",
    "account": "2876263442317436075686",
    "form": "virtual",
    "daily_limit": 800,
    "online_enabled": true,
    "international_enabled": false
  }'

La tarjeta física se pide con form: physical y su envío se sigue con POST /cards/{id}/shipment.

Motivos de rechazo

Cuando una autorización se rechaza, devolvemos el motivo en decline_reason y emitimos card.authorization.declined.

MotivoSignificado
card_not_activeLa tarjeta no está activa
insufficient_fundsSaldo insuficiente
daily_limitSupera el límite diario
monthly_limitSupera el límite mensual
credit_limitSupera el límite de crédito
online_disabledCompras online deshabilitadas
atm_disabledOperaciones en ATM deshabilitadas
international_disabledOperaciones internacionales deshabilitadas
account_frozenLa cuenta está congelada
user_blockedEl usuario final está bloqueado
kyc_requiredRequiere verificación de identidad

Ciclo de vida de un consumo

Retención, liquidación y reversa

La autorización retiene el importe sin debitarlo. Al liquidar, el importe sale del saldo y queda el asiento. Si el comercio no completa la operación, la reversa libera la retención.

POST /authorizations              → aprueba y retiene
POST /authorizations/{id}/settle  → debita y cierra
POST /authorizations/{id}/reverse → libera la retención

Multimoneda y cross-border

Cotizar y convertir

curl -X POST https://unipagos.com.ar/api/baas/v1/fx/quotes \
  -H "Authorization: Bearer sk_baas_live_…" \
  -d '{"from": "USD", "to": "ARS", "amount": 100}'
{
  "data": {
    "id": "qt_…",
    "from": "USD",
    "to": "ARS",
    "amount": 100,
    "market_rate": 1200.00,
    "rate": 1190.40,
    "result": 119040.00,
    "expires_at": "2026-08-14 01:25:00"
  }
}

La cotización queda bloqueada hasta su vencimiento. Para ejecutarla, pasás su id a POST /fx/convert junto con las dos cuentas.

Envíos entre países

curl -X POST https://unipagos.com.ar/api/baas/v1/cross-border \
  -H "Authorization: Bearer sk_baas_live_…" \
  -H "Idempotency-Key: xb-8891" \
  -d '{
    "from_account": "2876263442317436075686",
    "to_country": "MX",
    "amount": 300,
    "beneficiary_name": "Luis Ramírez",
    "beneficiary_document": "RAML870512",
    "payout": "cash"
  }'

La orden devuelve código de retiro y estado. Al entregarse emitimos crossborder.delivered.

Crédito embebido

Línea, préstamo y cuotas

Prestá sobre la cuenta que ya emitiste

Creás la línea con su límite y tasa, desembolsás préstamos contra esa línea y cobrás las cuotas. El desembolso se acredita en la cuenta del usuario final y cada cuota queda en el cronograma con su estado.

POST /credit-lines            {"end_user":"user-4821","limit":3000,"apr_pct":48}
POST /credit-lines/{id}/loans {"amount":1200,"installments":6}
GET  /loans/{id}              → cronograma con cuotas y mora
POST /loans/{id}/payments     {"installment":1}

Las cuotas vencidas pasan a late automáticamente. El límite disponible de la línea se libera a medida que se pagan.

Webhooks

Verificar la firma

Firmamos el cuerpo con HMAC-SHA256 usando el secret del destino y lo enviamos en X-Unipagos-Signature. Respondé 2xx para confirmar la recepción.

<?php
$payload = file_get_contents('php://input');
$signature = $_SERVER['HTTP_X_UNIPAGOS_SIGNATURE'] ?? '';
$secret = getenv('UNIPAGOS_BAAS_WEBHOOK_SECRET'); // whsec_...

if (!hash_equals(hash_hmac('sha256', $payload, $secret), $signature)) {
    http_response_code(401);
    exit('invalid signature');
}

$event = json_decode($payload, true);
switch ($event['event']) {
    case 'card.authorization.approved':
        // notificar al usuario final en tu app
        break;
    case 'transfer.completed':
        // marcar la orden como acreditada
        break;
}

http_response_code(200);
echo 'ok';

Eventos

EventoCuándo se emite
user.createdSe creó un usuario final
user.kyc.updatedCambió el estado de verificación
account.createdSe abrió una cuenta
account.updatedCambió el estado de una cuenta
ledger.entry.createdSe registró un movimiento
card.createdSe emitió una tarjeta
card.updatedCambió el estado o los límites de una tarjeta
card.authorization.approvedAutorización aprobada
card.authorization.declinedAutorización rechazada
card.transaction.settledConsumo liquidado
card.authorization.reversedAutorización reversada
transfer.completedTransferencia acreditada
transfer.failedTransferencia rechazada
payment.paidIntención de cobro pagada
fx.convertedConversión de moneda ejecutada
crossborder.createdOrden cross-border creada
crossborder.deliveredOrden cross-border entregada
credit.line.createdLínea de crédito creada
credit.loan.disbursedPréstamo desembolsado
credit.installment.paidCuota pagada
settlement.closedLiquidación cerrada

Referencia completa

Todos los endpoints

Los marcados como públicos no requieren clave. El resto pide Bearer y el permiso correspondiente.

Programa

MétodoRutaQué haceAcceso
GET /me Programa, plan, límites y permisos Bearer
GET /float Float por moneda y saldos emitidos Bearer
POST /float/fund Fondear el float Bearer
POST /float/withdraw Retirar del float Bearer
GET /balances Métricas del programa Bearer
GET /fees Comisiones aplicadas Bearer
GET /settlements Liquidaciones Bearer

Identidad

MétodoRutaQué haceAcceso
POST /users Crear usuario final Bearer
GET /users Listar usuarios finales Bearer
GET /users/{id} Ver usuario final Bearer
POST /users/{id}/kyc Enviar controles de identidad Bearer
GET /users/{id}/kyc Ver controles y nivel Bearer
POST /users/{id}/status Activar o bloquear Bearer

Cuentas y libro

MétodoRutaQué haceAcceso
POST /accounts Abrir cuenta Bearer
GET /accounts Listar cuentas Bearer
GET /accounts/{id} Ver cuenta Bearer
GET /accounts/{id}/ledger Extracto de la cuenta Bearer
POST /accounts/{id}/status Congelar o cerrar Bearer
GET /ledger Libro del programa Bearer

Transferencias y cobros

MétodoRutaQué haceAcceso
POST /transfers Transferir Bearer
GET /transfers Listar transferencias Bearer
GET /transfers/{id} Ver transferencia Bearer
POST /payment-intents Crear cobro con checkout Bearer
GET /payment-intents/{id} Estado del cobro Bearer
POST /payment-intents/{id}/pay Simular pago (sandbox) Bearer

Tarjetas

MétodoRutaQué haceAcceso
POST /card-programs Crear programa de tarjetas Bearer
GET /card-programs Listar programas Bearer
POST /cards Emitir tarjeta Bearer
GET /cards Listar tarjetas Bearer
GET /cards/{id} Ver tarjeta Bearer
POST /cards/{id}/status Activar, congelar, bloquear o cancelar Bearer
POST /cards/{id}/limits Cambiar límites y controles Bearer
POST /cards/{id}/pin Definir PIN Bearer
POST /cards/{id}/tokens Crear token de comercio o dispositivo Bearer
POST /cards/{id}/shipment Actualizar envío de la física Bearer
POST /authorizations Procesar autorización de consumo Bearer
GET /authorizations Listar autorizaciones Bearer
POST /authorizations/{id}/settle Liquidar Bearer
POST /authorizations/{id}/reverse Reversar Bearer

Multimoneda

MétodoRutaQué haceAcceso
GET /fx/rates Tasas con tu spread Bearer
POST /fx/quotes Cotizar con bloqueo de tasa Bearer
POST /fx/convert Convertir entre cuentas Bearer
POST /cross-border Crear envío internacional Bearer
GET /cross-border Listar envíos Bearer

Crédito

MétodoRutaQué haceAcceso
POST /credit-lines Crear línea de crédito Bearer
POST /credit-lines/{id}/loans Desembolsar préstamo Bearer
GET /loans/{id} Ver préstamo y cuotas Bearer
POST /loans/{id}/payments Pagar cuota Bearer

Eventos y catálogos

MétodoRutaQué haceAcceso
POST /webhooks Registrar destino de eventos Bearer
GET /webhook-events Últimas entregas Bearer
GET /health Estado del servicio público
GET /countries Países, monedas y rieles público
GET /rails Rieles por país público
GET /plans Planes y precios público
GET /events Catálogo de eventos de webhook público

Probalo en sandbox

Creás el programa desde tu cuenta empresa, generás la clave de prueba y el panel incluye un probador para ejecutar cualquier endpoint sin escribir código.