Payment Request Details API
curl --request GET \
--url https://api.pazy.io/v1.0/payment/request/:paymentRequestIdimport requests
url = "https://api.pazy.io/v1.0/payment/request/:paymentRequestId"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.pazy.io/v1.0/payment/request/:paymentRequestId', 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.pazy.io/v1.0/payment/request/:paymentRequestId",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$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.pazy.io/v1.0/payment/request/:paymentRequestId"
req, _ := http.NewRequest("GET", url, nil)
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.pazy.io/v1.0/payment/request/:paymentRequestId")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.pazy.io/v1.0/payment/request/:paymentRequestId")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_bodyPayment APIs
Payment Request Details API
Retrieve a single payment request (vendor advance) by its identifier
Payment Request Details API
curl --request GET \
--url https://api.pazy.io/v1.0/payment/request/:paymentRequestIdimport requests
url = "https://api.pazy.io/v1.0/payment/request/:paymentRequestId"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.pazy.io/v1.0/payment/request/:paymentRequestId', 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.pazy.io/v1.0/payment/request/:paymentRequestId",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$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.pazy.io/v1.0/payment/request/:paymentRequestId"
req, _ := http.NewRequest("GET", url, nil)
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.pazy.io/v1.0/payment/request/:paymentRequestId")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.pazy.io/v1.0/payment/request/:paymentRequestId")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_bodyAuthentication
All requests require an API key in the request headers. Headers:Authorization: Api-Key YOUR_API_KEY
In addition to the API key permission, the user the API key belongs to must have an admin or bookkeeper role in the organization. Any other role gets a
403 ACCESS_DENIED — see Error Responses.Request
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
paymentRequestId | string | Yes | Identifier of the payment request to retrieve (1–100 characters). This is the paymentRequestId returned by the Vendor Advance Creation API, or the id of any row returned by the Payment Request List API |
Only payment requests of type
VENDOR_ADVANCE are supported today. Requesting any other payment request type returns a 400 VALIDATION_ERROR — see Error Responses.Code Examples
curl -X GET https://api.pazy.io/v1.0/payment/request/payment_request_identifier \
-H "Authorization: Api-Key YOUR_API_KEY"
const response = await fetch(
'https://api.pazy.io/v1.0/payment/request/payment_request_identifier',
{
method: 'GET',
headers: {
Authorization: 'Api-Key YOUR_API_KEY'
}
}
);
const result = await response.json();
import requests
url = "https://api.pazy.io/v1.0/payment/request/payment_request_identifier"
headers = {
"Authorization": "Api-Key YOUR_API_KEY"
}
response = requests.get(url, headers=headers)
result = response.json()
Success Response
HTTP Status:200 OK
Response Fields:
| Field | Type | Description |
|---|---|---|
ok | boolean | Indicates whether the request was successful |
data.paymentRequest.id | string | Identifier of the payment request — the same value you passed as paymentRequestId |
data.paymentRequest.sequenceNo | string | Human-readable running number assigned to the request within the organization |
data.paymentRequest.type | string | Always VENDOR_ADVANCE |
data.paymentRequest.amount | number | Net payable amount of the request (after GST, TDS and round-off) |
data.paymentRequest.tax | object | Amount breakdown. null when no tax data is stamped on the advance |
data.paymentRequest.tax.subTotal | number | Original (pre-tax) amount the advance was raised for |
data.paymentRequest.tax.gst | number | GST amount added. 0 when GST was not applicable |
data.paymentRequest.tax.tds | number | TDS amount deducted. 0 when TDS was not applicable |
data.paymentRequest.tax.roundOff | number | Round-off adjustment applied to reach the net payable. Absent when no round-off was applied |
data.paymentRequest.currency | string | ISO currency code of the request e.g. INR |
data.paymentRequest.state | string | Approval lifecycle state of the request e.g. PENDING, APPROVED, REJECTED |
data.paymentRequest.paymentState | string | Payment lifecycle state e.g. AWAITING, PAID |
data.paymentRequest.approvalState | string | Payer’s approval state e.g. PENDING, APPROVED |
data.paymentRequest.requestDate | string | ISO 8601 timestamp of when the request was created |
data.paymentRequest.narration | string | Free-text description stored against the advance. Empty string when none was given |
data.paymentRequest.tags | object | Tags and custom fields on the advance, keyed by tag slug. See Tags Object |
data.paymentRequest.createdBy | object | User who created the request. null if the user could not be resolved |
data.paymentRequest.createdBy.id | string | Identifier of the creating user |
data.paymentRequest.createdBy.name | string | Name of the creating user |
data.paymentRequest.payer | object | User assigned as payer. null when no payer is assigned |
data.paymentRequest.payer.id | string | Identifier of the payer |
data.paymentRequest.payer.name | string | Name of the payer |
data.paymentRequest.vendor | object | Vendor the advance was raised for |
data.paymentRequest.vendor.id | string | Vendor identifier — usable with the Vendor Details API |
data.paymentRequest.vendor.name | string | Vendor display name |
data.paymentRequest.vendor.GSTIN | string | Vendor GSTIN. null when the vendor has none on record |
data.paymentRequest.vendor.PAN | string | Vendor PAN. Derived from the GSTIN when not stored separately; empty string when neither is available |
data.paymentRequest.purchaseOrderLink | object | Linked purchase order. null when the advance is not linked to a PO |
data.paymentRequest.purchaseOrderLink.id | string | Purchase order identifier — usable with the PO Details API |
data.paymentRequest.purchaseOrderLink.poNumber | string | Human-readable purchase order number |
Tags Object
tags is keyed by tag/field slug. Predefined organization tags (cost centre, department, location, expense head) carry the selected value’s id alongside its value; custom fields carry only a value.
"tags": {
"cost-centre": { "id": 812, "value": "Operations" },
"department": { "id": 47, "value": "Procurement" },
"project-code": { "value": "PRJ-1" }
}
Response Example
{
"ok": true,
"data": {
"paymentRequest": {
"id": "<paymentRequestId>",
"sequenceNo": "615",
"type": "VENDOR_ADVANCE",
"amount": 106200,
"tax": {
"subTotal": 100000,
"gst": 18000,
"tds": 1000,
"roundOff": -0.2
},
"currency": "INR",
"state": "PENDING",
"paymentState": "AWAITING",
"approvalState": "PENDING",
"requestDate": "2026-06-19T13:17:51.749Z",
"narration": "Advance for Q3 packaging order",
"tags": {
"cost-centre": { "id": 812, "value": "Operations" },
"project-code": { "value": "PRJ-1" }
},
"createdBy": {
"id": "<userId>",
"name": "John Doe"
},
"payer": {
"id": "<userId>",
"name": "Jane Smith"
},
"vendor": {
"id": "<vendorId>",
"name": "MDP Coffee House",
"GSTIN": "29AAJCM3528P1ZR",
"PAN": "AAJCM3528P"
},
"purchaseOrderLink": {
"id": "<purchaseOrderId>",
"poNumber": "PO-2026-0042"
}
}
}
}
Error Responses
Validation Errors
HTTP Status:400 Bad Request
Returned when paymentRequestId fails schema validation (empty, or longer than 100 characters).
{
"ok": false,
"error": {
"code": "VALIDATION_ERROR",
"message": "Validation failed: /paymentRequestId: must NOT have more than 100 characters"
}
}
Unsupported Payment Request Type
HTTP Status:400 Bad Request
The identifier resolves to a payment request that isn’t a vendor advance (e.g. a direct payment, reimbursement group, or bulk payout).
{
"ok": false,
"error": {
"code": "VALIDATION_ERROR",
"message": "Payment request API does not support DIRECT yet."
}
}
Payment Request Not Found
HTTP Status:404 Not Found
{
"ok": false,
"error": {
"code": "PAYMENT_REQUEST_NOT_FOUND",
"message": "Payment request not found"
}
}
Access Denied
HTTP Status:403 Forbidden
The API key’s user is not an admin or bookkeeper:
{
"ok": false,
"error": {
"code": "ACCESS_DENIED",
"message": "Access denied: only admins and bookkeepers can view payment request"
}
}
{
"ok": false,
"error": {
"code": "ACCESS_DENIED",
"message": "Payment request is not yet submitted"
}
}
{
"ok": false,
"error": {
"code": "ACCESS_DENIED",
"message": "Bulk payout is not enabled for this organization"
}
}
Authentication Errors
HTTP Status:401 Unauthorized
{
"ok": false,
"error": {
"code": "MISSING_CREDENTIALS",
"message": "Missing Credentials"
}
}
{
"ok": false,
"error": {
"code": "INVALID_API_KEY",
"message": "Invalid API Key"
}
}
Permission Errors
HTTP Status:403 Forbidden
{
"ok": false,
"error": {
"code": "INSUFFICIENT_PERMISSIONS",
"message": "Permission check failed - PERMISSION_CHECK_FAILED"
}
}
Best Practices
- Use
tax.subTotal(notamount) when you need the pre-tax value the advance was raised for —amountis the net payable after GST, TDS and round-off - Treat
purchaseOrderLinkandpayeras optional; both arenullfor advances raised without a PO link or before a payer is resolved - Poll
state,approvalStateandpaymentStatetogether to track a request end-to-end:statecovers approval,paymentStatecovers settlement - Store the
paymentRequestIdreturned by Vendor Advance Creation at create time rather than looking the request up by sequence number later
Was this page helpful?