Skip to content

Endpoints

URL base: https://api.zelta.dev/pay/v1

Todos los endpoints requieren autenticación mediante clave API en el header Authorization. Las respuestas usan formato JSON. Los montos se expresan en centavos (ej: $50.00 = 5000).

http
GET /payment-links

Parámetros de consulta:

ParámetroTipoDescripción
statusstringactive, paid, expired, disabled
fromdatetimeFecha de inicio del rango (ISO 8601)
todatetimeFecha de fin del rango (ISO 8601)
pageintegerNúmero de página (default: 1)
per_pageintegerResultados por página (default: 20, max: 100)

Respuesta exitosa (200):

json
{
  "data": [
    {
      "id": "pl_abc123",
      "amount": 15000,
      "currency": "USD",
      "description": "Consultoría de marketing digital - Sesión de 1 hora",
      "url": "pay.zelta.dev/link/abc123",
      "status": "active",
      "payment_methods": ["visa", "mastercard", "yappy", "nequi"],
      "logo_url": "https://storage.zelta.dev/logos/mi-negocio.png",
      "expires_at": "2026-03-18T23:59:59Z",
      "created_at": "2026-03-11T10:00:00Z",
      "paid_at": null
    }
  ],
  "meta": {
    "total": 45,
    "page": 1,
    "per_page": 20
  }
}
http
POST /payment-links

Cuerpo de la petición:

json
{
  "amount": 15000,
  "currency": "USD",
  "description": "Consultoría de marketing digital - Sesión de 1 hora",
  "payment_methods": ["visa", "mastercard", "amex", "yappy", "nequi", "ach"],
  "expires_at": "2026-03-18T23:59:59Z",
  "max_payments": 1,
  "reference": "INV-2026-042",
  "metadata": {
    "client_name": "Empresa ABC",
    "project": "Campaña Q1"
  }
}

Campos del cuerpo:

CampoTipoObligatorioDescripción
amountintegerSí*Monto en centavos. Omitir para monto abierto
currencystringCódigo de moneda: USD, PAB
descriptionstringDescripción visible para el cliente
payment_methodsarrayMétodos aceptados: visa, mastercard, amex, yappy, nequi, ach
expires_atdatetimeNoFecha de expiración (ISO 8601)
max_paymentsintegerNoNúmero máximo de pagos que acepta el link
referencestringNoReferencia interna para tu control
metadataobjectNoDatos adicionales en formato clave-valor

Respuesta exitosa (201):

json
{
  "data": {
    "id": "pl_def456",
    "amount": 15000,
    "currency": "USD",
    "description": "Consultoría de marketing digital - Sesión de 1 hora",
    "url": "pay.zelta.dev/link/def456",
    "status": "active",
    "payment_methods": ["visa", "mastercard", "amex", "yappy", "nequi", "ach"],
    "expires_at": "2026-03-18T23:59:59Z",
    "max_payments": 1,
    "reference": "INV-2026-042",
    "metadata": {
      "client_name": "Empresa ABC",
      "project": "Campaña Q1"
    },
    "created_at": "2026-03-11T10:00:00Z"
  }
}
http
GET /payment-links/{link_id}
http
DELETE /payment-links/{link_id}

Desactiva el link para que no acepte más pagos. Los pagos ya completados no se ven afectados.

Transacciones (Transactions)

Listar transacciones

http
GET /transactions

Parámetros de consulta:

ParámetroTipoDescripción
statusstringcompleted, pending, failed, refunded
payment_methodstringvisa, mastercard, amex, yappy, nequi, ach
link_idstringFiltrar por link de pago
fromdatetimeFecha de inicio del rango
todatetimeFecha de fin del rango
min_amountintegerMonto mínimo (centavos)
max_amountintegerMonto máximo (centavos)
pageintegerNúmero de página
per_pageintegerResultados por página

Respuesta exitosa (200):

json
{
  "data": [
    {
      "id": "txn_xyz789",
      "link_id": "pl_abc123",
      "amount": 15000,
      "currency": "USD",
      "description": "Consultoría de marketing digital - Sesión de 1 hora",
      "status": "completed",
      "payment_method": "visa",
      "card_last_four": "4242",
      "customer": {
        "email": "cliente@ejemplo.com",
        "name": "Juan Pérez"
      },
      "receipt_url": "pay.zelta.dev/receipts/txn_xyz789",
      "created_at": "2026-03-11T14:30:00Z",
      "completed_at": "2026-03-11T14:30:05Z"
    }
  ],
  "meta": {
    "total": 89,
    "page": 1,
    "per_page": 20
  }
}

Obtener transacción

http
GET /transactions/{transaction_id}

Reembolsar transacción

http
POST /transactions/{transaction_id}/refund

Cuerpo de la petición:

json
{
  "amount": 15000,
  "reason": "Solicitud del cliente"
}
CampoTipoObligatorioDescripción
amountintegerNoMonto a reembolsar en centavos. Si se omite, se reembolsa el total
reasonstringNoMotivo del reembolso

Respuesta exitosa (200):

json
{
  "data": {
    "id": "ref_abc123",
    "transaction_id": "txn_xyz789",
    "amount": 15000,
    "status": "processing",
    "reason": "Solicitud del cliente",
    "created_at": "2026-03-12T09:00:00Z"
  }
}

Reportes (Reports)

Resumen de ingresos

http
GET /reports/revenue

Parámetros de consulta:

ParámetroTipoDescripción
fromdatetimeFecha de inicio (obligatorio)
todatetimeFecha de fin (obligatorio)
group_bystringday, week, month (default: day)

Respuesta exitosa (200):

json
{
  "data": {
    "total_revenue": 1245000,
    "total_transactions": 89,
    "average_amount": 13988,
    "currency": "USD",
    "by_period": [
      {
        "date": "2026-03-01",
        "revenue": 425000,
        "transactions": 28
      },
      {
        "date": "2026-03-02",
        "revenue": 380000,
        "transactions": 31
      }
    ],
    "by_payment_method": {
      "visa": { "revenue": 560000, "transactions": 38 },
      "mastercard": { "revenue": 310000, "transactions": 22 },
      "yappy": { "revenue": 225000, "transactions": 18 },
      "nequi": { "revenue": 100000, "transactions": 8 },
      "ach": { "revenue": 50000, "transactions": 3 }
    }
  }
}

Reporte de liquidaciones

http
GET /reports/settlements

Parámetros de consulta:

ParámetroTipoDescripción
fromdatetimeFecha de inicio
todatetimeFecha de fin
statusstringprocessing, deposited
pageintegerNúmero de página
per_pageintegerResultados por página

Respuesta exitosa (200):

json
{
  "data": [
    {
      "id": "stl_abc123",
      "amount": 425000,
      "fees": 12750,
      "net_amount": 412250,
      "currency": "USD",
      "transactions_count": 28,
      "status": "deposited",
      "bank_account_last_four": "7890",
      "deposited_at": "2026-03-03T06:00:00Z",
      "period_from": "2026-03-01T00:00:00Z",
      "period_to": "2026-03-01T23:59:59Z"
    }
  ],
  "meta": {
    "total": 15,
    "page": 1,
    "per_page": 20
  }
}

Webhooks

Listar webhooks

http
GET /webhooks

Crear webhook

http
POST /webhooks

Cuerpo de la petición:

json
{
  "url": "https://tu-servidor.com/webhooks/zelta-pay",
  "events": ["payment.completed", "payment.refunded", "settlement.completed"],
  "secret": "whsec_tu_secreto_de_firma"
}

Obtener webhook

http
GET /webhooks/{webhook_id}

Actualizar webhook

http
PATCH /webhooks/{webhook_id}

Cuerpo de la petición:

json
{
  "events": ["payment.completed", "payment.failed", "payment.refunded"],
  "active": true
}

Eliminar webhook

http
DELETE /webhooks/{webhook_id}
bash
# 1. Crear un link de pago
curl -X POST https://api.zelta.dev/pay/v1/payment-links \
  -H "Authorization: Bearer zp_live_abc123def456" \
  -H "Content-Type: application/json" \
  -d '{
    "amount": 7500,
    "currency": "USD",
    "description": "Diseño de logo - Paquete básico",
    "payment_methods": ["visa", "mastercard", "yappy"],
    "expires_at": "2026-03-18T23:59:59Z",
    "reference": "LOGO-001"
  }'

# 2. Consultar transacciones del link
curl https://api.zelta.dev/pay/v1/transactions?link_id=pl_def456 \
  -H "Authorization: Bearer zp_live_abc123def456"

# 3. Generar reporte de ingresos del mes
curl "https://api.zelta.dev/pay/v1/reports/revenue?from=2026-03-01&to=2026-03-31&group_by=week" \
  -H "Authorization: Bearer zp_live_abc123def456"

Códigos de error

CódigoSignificado
400Petición malformada o parámetros inválidos
401Clave API inválida o no proporcionada
403Permisos insuficientes para esta operación
404Recurso no encontrado
409Conflicto (ej: reembolso duplicado)
422Datos de la petición no procesables (ej: monto negativo)
429Límite de tasa excedido
500Error interno del servidor

Formato de error:

json
{
  "error": "invalid_amount",
  "message": "El monto debe ser un número entero positivo expresado en centavos.",
  "status": 422
}

INFO

Los montos se expresan en centavos. Por ejemplo, $75.00 USD se envía como 7500. Todos los endpoints soportan paginación con page y per_page. Las fechas usan formato ISO 8601 con zona horaria. Los IDs de recursos usan prefijos descriptivos (pl_, txn_, ref_, stl_).

Documentación oficial de Zelta