.png?sv=2022-11-02&spr=https&st=2026-01-19T17%3A26%3A11Z&se=2026-01-19T17%3A38%3A11Z&sr=c&sp=r&sig=Vsgqfh8vLxLfl%2BgNx3S4Um%2B4sbrAlP4P2Pdzt%2FmPQeQ%3D)
We recommend that you migrate from the legacy Payment Link API to the new Payment Sessions API using the PAYMENT_LINK mode for the following benefits:
Feature Comparison
Feature | Legacy Payment Link | Payment Session |
|---|---|---|
Payment flows supported | Designed exclusively for one-time transactions | One-time payment, pay and save, save payment method, subscriptions (coming soon) within single integration |
Payment Channels Availability | Limited to legacy payment methods and specific regions | Availability for all existing channels and new channels in all regions Xendit supported |
New design for Xendit Hosted Page | Old design style, payment channel categorization is outdated | Fresh new design with improvement in user experience |
Failure Information | No feedback information send to the merchant when user fails payment attempts | Will send |
Integration Interfaces | Different endpoint required for various use cases | One integration method for all interfaces, including subscription (coming soon) |
Key Changes in Terminology
Before updating your implementation, understand how the concepts map to the Payment Sessions API:
Session Type: Instead of just "creating a link," you now define a goal: PAY (one-time), SAVE (save payment method), or PAY AND SAVE with
allow_save_payment_methodenabled.Interface: You specify the mode on
PAYMENT_LINKto tell Xendit that you want us to host the UI.New Primary Identifier:
payment_session_idis the primary identifier for tracking the payment lifecycle, replacing the older payment linkid.
How to migrate
Update your integration
Endpoints
Feature | Legacy Payment Link | Payment Session |
|---|---|---|
API Endpoint |
|
|
Parameter Conversion
The new Payment Sessions API supports most of the functionality of the legacy Payment Link. The following table maps the parameters and configuration between two APIs. Please refer to the API docs for the full lists
Legacy Payment Link | Payment Session | Notes |
|---|---|---|
|
| A reference to uniquely identify your transaction/order. |
|
| You can create the customer_id separately aor directly in the payment session request |
|
| Now defined as a specific timestamp or duration |
|
| Define what payment channels you want offer inside the hosted page |
|
| Define specific MID routing for cards payment. It’s commonly used if you use your own acquirer for cards payment. |
|
| Fee items are now defined as line items |
|
| Controls whether 3DS authentication is skipped |
| - | Currently it’s not yet supported (will be available in Q1 2026) |
| - | Currently it’s not yet supported (will be available in Q1 2026) |
Handle new errors
Adapt on your server’s logic to handle errors in Payment Sessions response.
Update and handle your webhook setup
Adjust the webhook URL to receive the information upon your payment sessions lifecycle.
Legacy Payment Link API
Invoices paid: Xendit will send webhook for paid invoicesInvoice expired: Xendit will send webhook for expired invoices
Payment Sessions API
Payment Session Completed: Xendit will send webhook when the payment session has completedPayment Session Expired: Xendit will send webhook when the payment session has expired
Optional but recommended
Payment v3 – Payment Status
Xendit sends webhooks whenever there is a status update on a Payment object.
payment.succeededIdentifies successful payments and includes full payment details.payment.failureIdentifies failed payment attempts, including failures that occur on the Xendit hosted page.
Payment Tokens v3 – Payment Token Status
Xendit sends webhooks whenever there is a status update on a Payment Token object.
This applies to PAY sessions with payment method saving enabled and SAVE session types.