PaygateDeveloper documentation
400payments.invalid_expirypaymentsRule R4

expires_in_minutes is outside the allowed range

expires_in_minutes must be at least 1 and no more than your tenant's max_expiry_minutes setting. Omit it and the payment gets your payment_expiry_minutes default.

Why the API refuses

WHEN a payment is created, THE SYSTEM SHALL set expires_at to now plus expires_in_minutes when supplied and within 1 and the tenant setting max_expiry_minutes, otherwise to now plus the tenant setting payment_expiry_minutes.

What to do

Omit the field unless you genuinely need a different window, and when you do send it, clamp it to the tenant maximum on your side. A PromptPay QR that outlives the payer's session is worse than one that expires: the payer pays, your basket is gone, and you are reconciling by hand.

Operations that can return it