Paying by card
Card details never pass through this API. For a card, POST /payments returns a payment page address; the customer types the card on the bank's page, 3D Secure completes there, and the payment is held only on the bank's confirmation.
curl -X POST https://api.example.com/partner/v1/payments \
-H "Authorization: Bearer ugp_…" -H "Content-Type: application/json" \
-d '{"service_request_id":"sreq_…","payment_method":"card"}'{
"escrow": { "id": "esc_…", "status": "created" },
"payment": {
"mode": "gateway",
"order_number": "esc_…",
"payment_url": "https://api.example.com/ug/payments/esc_…/pay"
}
}Send the customer to payment_url (browser or WebView). Follow the result with GET /payments?service_request_id=…: held means paid.
Current status
The hosted payment page is not connected to the bank yet. Until it is, an environment with real card payments answers a card POST /payments with 503 HOSTED_PAYMENT_UNAVAILABLE and opens no payment record; use bank transfer. In test environments (mode: "mock") the payment is held at once.
Grouped bookings
If the basket spans several trades, call POST /payments for every leg; a card charges the group's total once, through the first leg's (group_order smallest) page.