TDS Taxes API
curl --request GET \
--url https://api.pazy.io/v1.0/taxes/tdsimport requests
url = "https://api.pazy.io/v1.0/taxes/tds"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.pazy.io/v1.0/taxes/tds', 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/taxes/tds",
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/taxes/tds"
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/taxes/tds")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.pazy.io/v1.0/taxes/tds")
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_bodyTax APIs
TDS Taxes API
List the TDS tax rates configured for your organization
TDS Taxes API
curl --request GET \
--url https://api.pazy.io/v1.0/taxes/tdsimport requests
url = "https://api.pazy.io/v1.0/taxes/tds"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.pazy.io/v1.0/taxes/tds', 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/taxes/tds",
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/taxes/tds"
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/taxes/tds")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.pazy.io/v1.0/taxes/tds")
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_bodyTo create a new TDS rate, use the TDS Tax Creation API.
The permission required on your API key is Tax with the Read action enabled.
Authentication
All requests require an API key in the request headers. Headers:Authorization: Api-Key YOUR_API_KEY
Request
This endpoint takes no path parameters, query parameters, or body. Every TDS tax configured for the organization is returned in a single response — there is no pagination.Code Examples
curl -X GET https://api.pazy.io/v1.0/taxes/tds \
-H "Authorization: Api-Key YOUR_API_KEY"
const response = await fetch('https://api.pazy.io/v1.0/taxes/tds', {
method: 'GET',
headers: {
Authorization: 'Api-Key YOUR_API_KEY'
}
});
const result = await response.json();
import requests
url = "https://api.pazy.io/v1.0/taxes/tds"
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.tdsList | array | TDS taxes configured for the organization |
data.tdsList[].id | string | Tax id. Pass this as tdsId to the Vendor Advance Creation API |
data.tdsList[].label | string | Display name given to the tax in Pazy |
data.tdsList[].description | string | Description of the TDS section this tax falls under. - when the section has no description on record |
data.tdsList[].section | string | Income Tax Act section the deduction applies under e.g. 194C, 194J |
data.tdsList[].rate | number | Deduction value — a percentage when rateType is PERCENTAGE, an absolute amount when ABSOLUTE |
data.tdsList[].rateType | string | How rate is applied: PERCENTAGE or ABSOLUTE |
data.tdsList[].dateCreated | string | ISO 8601 timestamp of when the tax was created |
Response Example
{
"ok": true,
"data": {
"tdsList": [
{
"id": "5019",
"label": "TDS 194C LDC 1%",
"description": "TDS for product shoes",
"section": "194C",
"rate": 1,
"rateType": "PERCENTAGE",
"dateCreated": "2026-06-19T13:17:51.749Z"
},
{
"id": "5020",
"label": "TDS 194J 10%",
"description": "Fees for professional or technical services",
"section": "194J",
"rate": 10,
"rateType": "PERCENTAGE",
"dateCreated": "2026-05-02T10:11:03.221Z"
}
]
}
}
Empty Result
An organization with no TDS taxes configured returns200 with an empty array, not an error:
{
"ok": true,
"data": {
"tdsList": []
}
}
Error Responses
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
Returned when the API key doesn’t have the Tax resource with the Read action enabled.
{
"ok": false,
"error": {
"code": "INSUFFICIENT_PERMISSIONS",
"message": "Permission check failed - PERMISSION_CHECK_FAILED"
}
}
Server Errors
HTTP Status:500 Internal Server Error
{
"ok": false,
"error": {
"code": "INTERNAL_ERROR",
"message": "An unexpected error occurred"
}
}
Best Practices
- Use
idas thetdsIdwhen creating a vendor advance, and compute the expectedtdsAmountfromrateandrateType— the create API validates your figure against its own calculation and rejects a mismatch - Refresh this list at the start of each integration run rather than hardcoding ids; taxes are added and retired over time
- Match on
section(notlabel) when mapping to your own tax master — labels are free text set by the organization
Was this page helpful?