Los ejemplos usan el sandbox: API en
https://checkout-api.sandbox.z2pay.com y página en
https://pay.sandbox.z2pay.com. En producción, usa https://checkout-api.z2pay.com y
https://pay.z2pay.com.Endpoints
| Método | Ruta | Qué hace | Rate-limit |
|---|---|---|---|
GET | /public/checkout/{id} | Obtiene la configuración pública para renderizar la página | 60 req/min/IP |
POST | /public/checkout/{id}/opened | Marca la Session como “abierta por el comprador” | 60 req/min/IP |
POST | /public/checkout/{id}/confirm | Confirma el pago (tokenId + datos del comprador) | 10 req/min/IP |
El
{id} puede ser una Session (cs_*), un Link (chk_*) o un slug. Cuando recibe Link o slug, el
endpoint materializa una Session nueva y la retorna.Obtener configuración pública
cs_*) o Link
(chk_*). Cuando recibe un Link, materializa una Session nueva y la retorna.
Solo cuando
{id} es Link (chk_*). El cliente envía un ID candidato (cs_[a-f0-9]{48}, generado
localmente con 192 bits) para que la Session sea materializada idempotentemente — un refresh con el
mismo sessionId reutiliza la Session existente. Para cs_* directo, el parámetro es ignorado.200):
La Session retornada es una vista pública enmascarada — no incluye
metadata, tenantId ni
transactionId. Solo lo necesario para renderizar la página.200 · 404 (ID inválido o expirado).
Marcar como abierta
created → opened solo en la primera llamada. Dispara el evento
checkout.session.opened.
Requerido solo cuando
{id} es Link (chk_*). El mismo sessionId del GET; permite materializar
idempotentemente la Session.200):
Confirmar pago
cs_*)
o Link (chk_*). Es idempotente mediante el header Idempotency-Key: las solicitudes repetidas
devuelven la respuesta original y una llamada concurrente espera a que la primera termine — defensa
primaria contra cobros duplicados.
Body
Entradas de pago (1–8). 1 entrada = flujo single-method; 2+ entradas = pago combinado (requiere
paymentMethods.combined.enabled en la Session). La suma de los amount debe coincidir
exactamente con session.amount.Datos completos del comprador. Deben satisfacer los
requiredFields de la Session (email, document y
phone son siempre obligatorios; address si está listado). Ver
Customer.Valores de los
customFields de la Session. Las keys coinciden con customFields[].key; los valores son
strings ("true"/"false" para checkbox); cada valor ≤ 2000 chars.payments se discrimina por paymentMethod:
Tarjeta
Tarjeta
tokenId es obligatorio; holderName opcional; installments de 1 a 12. Tokeniza la tarjeta mediante
el Tokenizer antes del confirm.PIX
PIX
Boleto
Boleto
Ejemplo completo
200):
- En PIX,
pixUrltrae el payload BR-Code para la app bancaria;expiresAtindica el vencimiento. - En boleto,
boletoUrl/boletoDigitableLine/boletoBarcodetraen los datos del boleto. - Si es rechazado,
session.statusvuelve aopened(se permite reintento) ypayments[].errorMessage/declineCodeexplican el motivo.
200 (resultado del pago, exitoso o rechazado) · 409 (Session en estado
inválido — ya pagada, expirada, cancelada — o Link padre archivado → link_not_active).
Ciclo del comprador (resumen)
Abre la URL
El comprador accede a
https://pay.sandbox.z2pay.com/c/{id}. La página llama a
GET /public/checkout/{id} para cargar la configuración.La página marca como abierta
La página llama a
POST /public/checkout/{id}/opened — la Session pasa de created → opened y
dispara checkout.session.opened.El comprador confirma
Al hacer clic en “Pagar”, la página tokeniza la tarjeta (si aplica) y llama a
POST /public/checkout/{id}/confirm. La Session pasa por paying y termina en paid (o vuelve a
opened si es rechazada).Ver también
Checkout Sessions
Estados de la Session y el objeto Customer.
Visión general del Checkout
Conceptos y mapa de endpoints.
Tokenizer
Cómo generar el
tokenId de la tarjeta antes del confirm.Tarjetas de prueba
Escenarios de aprobación y rechazo en el sandbox.
Webhooks
Eventos disparados a lo largo del ciclo del comprador.
Errores
Códigos de dominio del confirm (
amount_mismatch, combined_disabled, etc.).
