curl --request GET \
--url https://api-pacb-uat.eximpe.com/pg/payment-links/{link_id}/ \
--header 'X-API-Version: <api-key>' \
--header 'X-Client-ID: <api-key>' \
--header 'X-Client-Secret: <api-key>'import requests
url = "https://api-pacb-uat.eximpe.com/pg/payment-links/{link_id}/"
headers = {
"X-Client-ID": "<api-key>",
"X-Client-Secret": "<api-key>",
"X-API-Version": "<api-key>"
}
response = requests.get(url, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {
'X-Client-ID': '<api-key>',
'X-Client-Secret': '<api-key>',
'X-API-Version': '<api-key>'
}
};
fetch('https://api-pacb-uat.eximpe.com/pg/payment-links/{link_id}/', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api-pacb-uat.eximpe.com/pg/payment-links/{link_id}/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Version: <api-key>",
"X-Client-ID: <api-key>",
"X-Client-Secret: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api-pacb-uat.eximpe.com/pg/payment-links/{link_id}/"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-Client-ID", "<api-key>")
req.Header.Add("X-Client-Secret", "<api-key>")
req.Header.Add("X-API-Version", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api-pacb-uat.eximpe.com/pg/payment-links/{link_id}/")
.header("X-Client-ID", "<api-key>")
.header("X-Client-Secret", "<api-key>")
.header("X-API-Version", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-pacb-uat.eximpe.com/pg/payment-links/{link_id}/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-Client-ID"] = '<api-key>'
request["X-Client-Secret"] = '<api-key>'
request["X-API-Version"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"success": true,
"message": "Payment link details fetched successfully",
"data": {
"payment_id": "PR4829301756",
"link_id": "PR4829301756",
"reference_id": "ORD-2026-000123",
"currency": "INR",
"payment_link": "https://api-pacb-uat.eximpe.com/p/Xk3nQ7bT2mWp9vLc4R/",
"expiry_date": "2026-12-31T18:29:59.000000Z",
"mop_type": null,
"settlement": {
"status": "not_applicable",
"message": null,
"settlement_details": null
},
"buyer": {
"name": "Rahul Sharma",
"email": "[email protected]",
"phone": "+919876543210",
"address": {
"line_1": "221B MG Road",
"line_2": "Indiranagar",
"city": "Bengaluru",
"state": "Karnataka",
"postal_code": "560038"
},
"pan_number": null,
"dob": null
},
"product": {
"name": "Annual subscription",
"description": "12-month premium plan",
"hs_code": null,
"hs_code_description": null,
"type_of_goods": "service"
},
"invoice": {
"number": "INV2026000123",
"date": null,
"file": null
},
"air_waybills": [],
"status": "active",
"status_message": null,
"created_at": "2026-09-14T09:30:15.123456Z",
"paid_payment_id": null,
"payments": []
}
}Retrieve Payment Link
Fetch one payment link by its link_id: where it stands, how it was paid, when it expires, and who it is for.
curl --request GET \
--url https://api-pacb-uat.eximpe.com/pg/payment-links/{link_id}/ \
--header 'X-API-Version: <api-key>' \
--header 'X-Client-ID: <api-key>' \
--header 'X-Client-Secret: <api-key>'import requests
url = "https://api-pacb-uat.eximpe.com/pg/payment-links/{link_id}/"
headers = {
"X-Client-ID": "<api-key>",
"X-Client-Secret": "<api-key>",
"X-API-Version": "<api-key>"
}
response = requests.get(url, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {
'X-Client-ID': '<api-key>',
'X-Client-Secret': '<api-key>',
'X-API-Version': '<api-key>'
}
};
fetch('https://api-pacb-uat.eximpe.com/pg/payment-links/{link_id}/', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api-pacb-uat.eximpe.com/pg/payment-links/{link_id}/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Version: <api-key>",
"X-Client-ID: <api-key>",
"X-Client-Secret: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api-pacb-uat.eximpe.com/pg/payment-links/{link_id}/"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-Client-ID", "<api-key>")
req.Header.Add("X-Client-Secret", "<api-key>")
req.Header.Add("X-API-Version", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api-pacb-uat.eximpe.com/pg/payment-links/{link_id}/")
.header("X-Client-ID", "<api-key>")
.header("X-Client-Secret", "<api-key>")
.header("X-API-Version", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-pacb-uat.eximpe.com/pg/payment-links/{link_id}/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-Client-ID"] = '<api-key>'
request["X-Client-Secret"] = '<api-key>'
request["X-API-Version"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"success": true,
"message": "Payment link details fetched successfully",
"data": {
"payment_id": "PR4829301756",
"link_id": "PR4829301756",
"reference_id": "ORD-2026-000123",
"currency": "INR",
"payment_link": "https://api-pacb-uat.eximpe.com/p/Xk3nQ7bT2mWp9vLc4R/",
"expiry_date": "2026-12-31T18:29:59.000000Z",
"mop_type": null,
"settlement": {
"status": "not_applicable",
"message": null,
"settlement_details": null
},
"buyer": {
"name": "Rahul Sharma",
"email": "[email protected]",
"phone": "+919876543210",
"address": {
"line_1": "221B MG Road",
"line_2": "Indiranagar",
"city": "Bengaluru",
"state": "Karnataka",
"postal_code": "560038"
},
"pan_number": null,
"dob": null
},
"product": {
"name": "Annual subscription",
"description": "12-month premium plan",
"hs_code": null,
"hs_code_description": null,
"type_of_goods": "service"
},
"invoice": {
"number": "INV2026000123",
"date": null,
"file": null
},
"air_waybills": [],
"status": "active",
"status_message": null,
"created_at": "2026-09-14T09:30:15.123456Z",
"paid_payment_id": null,
"payments": []
}
}Overview
Returns one payment link: itsstatus, the payments made through it, its expiry_date, buyer, product, invoice and settlement. Use it to confirm a link’s outcome — for an active link it checks for a payment before answering, so it can be ahead of List Payment Links.
Path Parameters
link_id: The link’s ID from Create Payment Link, e.g.PR4829301756. Thepayment_idit returned is the same value.
link_id: the webhook’s payment_id names the payment, not the link.
A link that is not yours — or, for a PSP, not one of your sub-merchants’ — reads as not found:
{
"success": false,
"error": {
"code": "ERR_PAYMENT_005",
"message": "Payment not found",
"details": {
"payment_id": "Payment not found"
}
}
}
X-Merchant-ID here: a sub-merchant’s link is found without it.
Link status
status | Meaning |
|---|---|
active | Open for payment. |
paid | Paid. This outranks expiry: a paid link reads paid even after its expiry_date passes. |
expired | Past its expiry_date, or deactivated — a deactivated link reads expired. |
failed | Could not be created, or closed without being paid. |
How the link was paid
A buyer may try more than once before a payment goes through. Two fields show the payments made through the link:paid_payment_id: Thepayment_idof the payment that paid the link, ornulluntil it is paid. Refund and reconcile by this ID — see Tracking a payment link.payments: The payments made through the link, newest first — at most the 50 newest. Each entry carries:
| Field | Description |
|---|---|
payment_id | The payment’s ID. Its payment webhooks carry it, next to the link’s link_id |
status | pending while it is under way, captured once it went through, failed — or, rarely, invalid — if it did not |
mop_type | The method it was made with, in lowercase (upi, credit_card), or null when none is recorded |
amount | Its amount, in the format Create Payment Link returns: a decimal string, "1500" for whole rupees and "1500.50" when there are paise |
created_at | When it was made |
payment_completed_at | When it completed, or null until it has — usually null for a payment that failed |
payments holds a single entry whose payment_id is link_id, from the moment the link is created, and paid_payment_id becomes that same ID once the buyer pays. Elsewhere each try is a payment of its own, and payments stays empty until the buyer first tries to pay.
A link the buyer paid on their second try, with the rest of the response left out:
{
"link_id": "PR6120458839",
"status": "paid",
"paid_payment_id": "PR7730215564",
"payments": [
{
"payment_id": "PR7730215564",
"status": "captured",
"mop_type": "upi",
"amount": "1500",
"created_at": "2026-09-14T10:02:44.519302Z",
"payment_completed_at": "2026-09-14T10:03:21.087716Z"
},
{
"payment_id": "PR7730209921",
"status": "failed",
"mop_type": "credit_card",
"amount": "1500",
"created_at": "2026-09-14T09:48:10.332907Z",
"payment_completed_at": null
}
]
}
Response Fields
amount from Create Payment Link, or read amount from List Payment Links.link_id: The link’s ID.payment_idis the same value, kept for compatibility.expiry_date: When the link stops accepting payment. For a deactivated link, the moment it was deactivated.mop_type: The method the buyer paid with, in uppercase (UPI,CREDIT_CARD) — List gives the same value in lowercase. It isnulluntil the link is paid, and can staynullafter.paymentsgives the method of each payment.buyer,product,invoice: As sent on create.buyer.pan_numberandbuyer.dobarenullunless they were collected from the buyer.product.hs_codeandproduct.hs_code_descriptionarenull: the link does not store them.invoice.dateandinvoice.filearenullunless they were added to the order later.
settlement: The settlement state recorded against the link.settlement_detailsstaysnulluntil the payment is part of a settlement; itssettlement_idis what Get Settlement takes. Whenpaid_payment_iddiffers fromlink_id, the money moved on that payment rather than on the link, andsettlementdoes not follow it: reconcile bypaid_payment_id.status_message: Why the link failed or closed, when there is a reason to give; otherwisenull.created_atand the other timestamps are UTC with microseconds, e.g.2026-09-14T09:30:15.123456Z.
Authorizations
Client Application ID - Your unique application identifier used to authenticate API requests. You can find your Client ID in the Developer Settings section of the merchant dashboard.
Client Secret Key - Your secret key used alongside the Client ID for secure authentication. Keep this confidential and never expose it in client-side code. Available in the Developer Settings section of the merchant dashboard.
API Version - Specifies which version of the API to use (e.g., '1.X.X', '2.X.X', or '3.X.X'). This header allows you to control which API version your integration uses. Default version information is available in the Developer Settings.
Path Parameters
The link's link_id, as returned by Create Payment Link (PR followed by 10 digits). The payment_id Create Payment Link returns is the same value.
"PR4829301756"
Response
The payment link