Agentic Payments
You can search for a hotel, choose a room and complete your booking through your AI agent. Connect it to Wink and a payment wallet, then tell it where you want to stay. Wink uses the Machine Payments Protocol (MPP) to accept the wallet’s payment and return your booking confirmation.
1. Connect the MCP servers
Section titled “1. Connect the MCP servers”For the complete booking flow, your agent needs Wink Booking Engine and a payment wallet.
| Connection | What it does | How to add it |
|---|---|---|
| Wink Booking Engine — required | Finds destinations, searches hotels and room rates, quotes and confirms bookings, and retrieves your bookings and receipts. | Add https://api.wink.travel/mcp/booking-engine as a remote HTTP MCP server. |
| Payment wallet — required to pay | Provides payment credentials after you approve the purchase. | Connect a wallet that supports Stripe Shared Payment Tokens. See the Link example below. |
| Wink Reference — optional | Looks up countries, currencies and other reference data. | https://api.wink.travel/mcp/reference |
| Wink Docs — optional | Helps your agent read documentation and API contracts. | https://docs.mcp.wink.travel/mcp |
The Booking Engine MCP already includes the tools needed for the traveler booking flow, when agentic booking and payment are enabled for that environment. Wink’s separate Payment MCP is for financial operations such as ledgers and withdrawals; it is not needed to pay for a room.
Sign in and choose permissions
Section titled “Sign in and choose permissions”- Open your agent’s MCP or connector settings and add the Booking Engine URL above. Give it a name such as Wink Booking.
- Your agent opens the Wink sign-in page in your browser. Sign in with the Wink account you want to book under.
- On the consent screen, choose the permissions your agent needs, then approve the connection.
- Return to your agent. It loads the available tools and manages authentication for subsequent MCP calls.
For this flow, select:
| Permission | Why it is needed |
|---|---|
AI agent access (mcp.read) | Allows your agent to connect to Wink MCP. |
Marketing read (marketing.read) | Lets the agent find your account’s booking configuration, called a customization. Your account must also have access to that configuration. |
Payment write (payment.write) | Lets the agent pay for the quote and confirm the booking. |
Keep the sign-in permissions requested by the connection. Your MCP client handles access tokens; you do not need to copy a token into chat or set request headers. If you skipped a needed permission, reconnect through your client’s sign-in flow and approve it.
Connect a payment wallet
Section titled “Connect a payment wallet”For Stripe payments, one option is Link’s agent wallet. If your client supports local MCP servers and Node.js is installed, add this entry to its MCP configuration:
{ "mcpServers": { "link": { "command": "npx", "args": ["@stripe/link-cli", "--mcp"] } }}Ask your agent to connect your Link account, then follow the verification link it provides and approve the connection. Link supplies the Shared Payment Token used to pay for the booking. Link currently supports US accounts; check its spending limits before booking. See Link’s setup guide and MCP configuration.
If your agent already has a compatible wallet connected, use that connection. Wallet setup and payment approval are separate from signing in to Wink.
2. Ask your agent to find a room
Section titled “2. Ask your agent to find a room”For example:
Find a room in Bangkok for two adults from 15 to 17 January 2027. Show me the available options, total price and cancellation terms before I choose.
Your agent can find your accessible Wink accounts and their booking configurations. If you have several, tell it which one to use. If you are booking through a supplied booking link or configuration, give that to the agent instead.
The agent then resolves your destination, checks available hotels and loads room rates for your dates. Choose a room and ask for a quote.
This payment flow currently supports one room, priced in USD, for adults only. A quote has an expiry time. Requesting one does not charge you or confirm a booking.
3. Review and approve payment
Section titled “3. Review and approve payment”Check the hotel, room, dates, guests, cancellation terms and quoted total. When you are ready, ask your agent to book and complete any approval requested by your wallet.
The wallet provides a Stripe Shared Payment Token to pay for the quote.
Tempo stablecoin payments are coming soon.
After payment succeeds, your agent gives you a booking confirmation code. It can also retrieve the booking details and receipt through the Booking Engine MCP.
If payment is still processing or the response is lost, let the agent check the same payment attempt. It should reuse the quote and payment credential instead of starting a second payment. If payment is declined, ask for a fresh quote and review it before trying again.
Tool reference for agents and developers
Section titled “Tool reference for agents and developers”All Wink tools below are available through the Booking Engine MCP. The MCP client sends authentication automatically using the permissions approved during sign-in.
| Step | Tools and behavior |
|---|---|
| Select booking context | managing_entity_list, then customization_get_primary or customization_search for the selected account. Use a supplied customization when one is already known. |
| Find a destination | destination_lookup_search_suggestions and destination_lookup_get. |
| Search hotels and rooms | inventory_search_city or inventory_search_geo, then property_inventory_get for rates and availability. |
| Quote the selected room | agentic_booking_quote. Pass room details inside its request argument. |
| Pay and confirm | Obtain a Shared Payment Token from the connected wallet, then call agentic_booking_pay with request.quoteId and request.spt. Keep the same signed-in Wink user for quote and payment. |
| Retrieve the booking and receipt | Use booking_search or booking_search_list to find the confirmed booking, then booking_get and booking_receipt_get with its booking identifier. |
The quote request needs hotelIdentifier, roomRateIdentifier, checkIn, checkOut, adults, children and customizationIdentifier. Dates use YYYY-MM-DD; checkOut must follow checkIn. Set adults to at least 1 and children to 0.
The quote returns quoteId, amountUsdCents, currency, expiresAt and mppChallenges. Display USD cents as dollars: 10000 means $100.00.
| Pay result | Next step |
|---|---|
PAYMENT_SUCCEEDED | Save bookingConfirmationCode and chargeReference. |
IN_PROGRESS | Wait briefly and retry the same quote and credential. |
DECLINED | Request a fresh quote and review it before another payment. |
A successful retry returns the existing booking without charging again. Treat a timeout as an unknown outcome and retry the same payment. If it stays unresolved, contact support with the quote ID.
Payment-aware MCP clients
Section titled “Payment-aware MCP clients”Payment-aware MCP clients can use agentic_booking_book with the room fields directly in arguments. The first call returns error -32042 with payment challenges. Retry the same call with the wallet credential in params._meta["org.paymentauth/credential"]; success includes result._meta["org.paymentauth/receipt"]. Error -32043 carries a payment failure and challenge: a definitive rejection needs a fresh quote, while an incomplete payment payload can retry with the same challenge. For -32603, a data.failure.reason of payment-in-progress or already-consumed means retry the same credential; the error code alone is not enough.
Book over REST
Section titled “Book over REST”Use REST when building an integration that calls Wink directly over HTTP. Both the quote and payment use POST https://api.wink.travel/api/mpp/booking.
Your application needs a Wink user access token with payment.write permission to pay. Keep the same user for both calls. Send the token in Wink-Authorization, leaving Authorization available for the wallet’s payment credential. These headers apply to REST; an MCP client handles its own authentication.
1. Request a quote
Section titled “1. Request a quote”Save the selected room as booking.json, replacing the example identifiers and dates with your selection. The room fields go directly in the JSON body, without a request wrapper.
{ "hotelIdentifier": "YOUR_HOTEL_ID", "roomRateIdentifier": "YOUR_ROOM_RATE_ID", "checkIn": "2027-01-15", "checkOut": "2027-01-17", "adults": 2, "children": 0, "customizationIdentifier": "YOUR_CUSTOMIZATION_ID"}Set WINK_ACCESS_TOKEN to the user’s access token and send the request:
curl -i https://api.wink.travel/api/mpp/booking \ -H "Wink-Authorization: Bearer $WINK_ACCESS_TOKEN" \ -H 'Content-Type: application/json' \ --data-binary @booking.jsonWink returns 402 Payment Required with a WWW-Authenticate: Payment ... challenge for each offered method. The JSON body includes quoteId, amount, currency, expiresAt and methods. Here, amount is a string in USD cents: "10000" means $100.00. Review the quote before its expiry; no payment has been taken yet.
2. Pay and confirm
Section titled “2. Pay and confirm”Have the wallet fulfill the returned Stripe challenge by supplying a Shared Payment Token in payload.spt. Use the payment details from that challenge.
Set MPP_CREDENTIAL to the wallet’s encoded MPP credential, which contains the challenge and payment payload. Retry the same request body, keeping the identity header:
curl -i https://api.wink.travel/api/mpp/booking \ -H "Wink-Authorization: Bearer $WINK_ACCESS_TOKEN" \ -H "Authorization: Payment $MPP_CREDENTIAL" \ -H 'Content-Type: application/json' \ --data-binary @booking.jsonOn success, Wink returns 200 OK, a JSON body containing bookingConfirmationCode, and a Payment-Receipt header. Save the confirmation and receipt. A successful retry returns the existing booking without charging again.
Handle responses and retries
Section titled “Handle responses and retries”| Response | What to do |
|---|---|
400 | Correct invalid room details or a malformed credential. |
401 / 403 | Check the user’s authentication and payment permission. |
402 | Inspect the returned problem and challenge. A definitive payment rejection gets a fresh quote; an incomplete payment payload reuses the original challenge. Review the price before paying. |
409 | The payment outcome is unresolved. Wait briefly, then retry the same body and credential at the booking endpoint. |
429 | Wait for the number of seconds in Retry-After, then retry. |
A 409 response has an application/problem+json body. Match its type against these exact URLs:
| Problem type | Meaning |
|---|---|
| https://api.wink.travel/problems/payment-in-progress | A payment attempt is still running or settlement cannot yet be confirmed. |
| https://api.wink.travel/problems/already-consumed | The challenge or payment proof was already used by a possibly successful attempt. This alone does not confirm the booking. |
Both mean retry the same payment; do not pay a new quote. The URLs identify and document the problem; they are not payment or polling endpoints. Retry POST /api/mpp/booking, and use the problem type rather than the free-text detail to decide what to do. See the problem-type reference for all Wink payment problems.
A timeout, lost response or server error after submitting payment can also leave the outcome unknown. Retry the same payment request. If the outcome stays unresolved, contact support with the quote ID before starting another payment.
