POST /api/v1/checkout/sessions
Hosted-checkout flow — devolvemos NUESTRO checkout URL y manejamos toda la UI por método.
Endpoint dedicado para el flujo hosted checkout: la respuesta es una checkout session con checkoutUrl (https://sandbox.key2pays.com/c/<sessionId>). Redirigís al cliente ahí y nosotros renderizamos la UI por método (QR para PIX, CLABE para SPEI, redirect a tarjetas, referencia de voucher para cash, etc.). Cuando termina, el cliente vuelve a returnUrl y el estado del pago llega por webhook. Nunca ves la URL del provider upstream — eso queda escondido, así si rotamos providers, tu integración no se entera.
paymentFormUrl del provider.Body (idéntico a POST /payments)
El body acepta los mismos campos que POST /api/v1/payments — amount, paymentMethodId,country, userEmail,merchantOrderId, returnUrl. No hace falta mandar hostedCheckout: true: este endpoint lo asume.
curl https://sandbox.key2pays.com/api/v1/checkout/sessions \
-H "Authorization: Bearer sk_test_51N8mP...exampleK3Y" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"amount": 50,
"paymentMethodId": "1001",
"country": "MEX",
"userEmail": "carlos@example.com",
"merchantOrderId": "ORD-12345",
"returnUrl": "https://your-store.com/orders/1234"
}'Respuesta
{
"sessionId": "TXN-MP25SDIS-ZQ68",
"checkoutUrl": "https://sandbox.key2pays.com/c/TXN-MP25SDIS-ZQ68?returnUrl=https%3A%2F%2Fyour-store.com%2Forders%2F1234",
"paymentMethodId": "1001",
"status": "pending",
"amount": 50,
"amountLocal": 882.17,
"currencyLocal": "MXN",
"fxRate": 17.64,
"expiresAt": "2026-05-12T16:00:00.000Z"
}POST /api/v1/payments con hostedCheckout: true sigue funcionando exactamente igual — usá el endpoint que prefieras.