---
title: "Finalize a hotel checkout after payment"
method: POST
path: "/v1/payments/{publicId}/confirm"
tags: ["payments"]
---

# Finalize a hotel checkout after payment

`POST /v1/payments/{publicId}/confirm`

## Request

- Base URL: `https://api.getmyhotels.com`
- URL: `https://api.getmyhotels.com/v1/payments/{publicId}/confirm`
- Auth: none declared

Runs `payment.confirm` for the payment transaction created by `POST /v1/payments/hotel-checkout-intent`. Public by design — it is the second half of the guest-capable payment-first checkout (critical decision #4), and ownership is enforced by the procedure against the transaction's own userId. Call it after the Stripe PaymentSheet reports success, or immediately when the intent came back with `testMode: true` (staff simulate path). Send `{}` when there is no provider transaction id to pass through. The booking row, supplier reservation and confirmation email are all created here, so the response carries the booking reference the confirmation screen shows.

## Path parameters

- `publicId` string, required

## Request body

- object
  - `providerTransactionId` string

## Response `200`

Success

- unknown

## Other responses

- `400`: Request validation failed or the router rejected the input
- `404`: Resource not found
- `426`: Reported X-GMH-App-Version is below the supported minimum — the app must update
- `500`: Unexpected server error (opaque; details stay in logs)

---

[API](https://skmtc.dev/getmyhotels/apis/getmyhotels-rest-api.md) · [All operations](https://skmtc.dev/getmyhotels/apis/getmyhotels-rest-api/llms.txt) · [OpenAPI document](https://skmtc.dev/getmyhotels/apis/getmyhotels-rest-api/revisions/cba24a9c13f0?raw)
