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 - Optional, and not a credential. Send 3.0.0 for v3. If you omit it, the call still succeeds and the response echoes your account's default version in an X-API-Version header.
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