Changelog
A CatchPay confirmation now carries pin, the payer's 4-digit CatchPay PIN as typed in a secure payment UI, in place of encrypted_catch_pay_password. The provider encrypts it with CatchTable's key for this confirmation only and never stores or returns it. A booking that charges nothing and has no meal auto-pay consent takes no PIN.
BREAKING for callers that pay with catch_pay. The bound transition runs from the 2026-10-14 contract to the 2026-10-21 release. (1) Request: in payment {method: catch_pay}, encrypted_catch_pay_password is removed and no longer required; send pin, the payer's 4-digit CatchPay PIN as typed in a secure payment UI, when the reservation charges the card (payment_amount_krw above 0 or auto_pay_consent). A booking with payment_amount_krw 0 and no auto_pay_consent takes no PIN, and a PIN sent for it is not used. The provider encrypts the PIN with CatchTable's key and never stores or returns it. card_id, use_point, penalty_consent and auto_pay_consent are unchanged; send the same use_point that reserve or reserve-answer recorded. The other payment branches and payment_method are unchanged. (2) Response: unchanged, except that needs_input add-on valid_options add unit_price_krw and age_verification_required. (3) Errors, all new: CATCHPAY_PASSWORD_MISMATCH (400) and CATCHPAY_PASSWORD_UNVERIFIED (502), nothing sent, retry the same attempt_token with a newly entered PIN only when the user asks; CATCHPAY_PIN_RESET_REQUIRED (409, the account holder must set a new CatchPay password in CatchTable first); SEAT_UNAVAILABLE (409, CatchPay create refused the seat, the attempt stays open: send the new choice with reserve-answer and confirm again); IDENTITY_VERIFICATION_REQUIRED (409, free attempts only, confirm again after the account completes identity verification in CatchTable); ADULT_MENU_NOT_ALLOWED (409, choose a menu without the adult-only item via reserve-answer); ATTEMPT_EXPIRED_UNSENT (400, nothing was sent; start a new reserve); PERSON_OUT_OF_RANGE (409) and ONLINE_RESERVATION_UNAVAILABLE (409). details.dispatched tells whether the call sent anything: false when nothing was sent, refused when CatchTable refused the create. No error code was removed.